TCP/IP 网络套接字编程实验目的及要求:掌握TCP/IP网络套接字编程的工作原理,学会使用Winsock编制网络会话程序。
实验方法:1. 阅读文档,熟悉TCP/IP网络套接字编程的工作原理,参考本实验后附录的客户与服务器程序简例,实验前事先改编一个DOS命令行方式下的网络会话程序,要求双方能交替打入任意语句(一方打入语句后,停止、等待另一方回答,待对方回答后,再打入另一语句……,直至任一方键入一个ESC键为止,结束会话);2. 使用tc/vc,输入、编辑、编译、运行与调试网络会话程序。
实验内容:1. 写出改编的C++ Builder 网络会话源程序如下:2. 运行、测试网络会话程序,记录测试结果,分析遇到的问题与解决的办法;3. 总结TCP/IP 网络套接字编程的一般编程步骤。
[附录] C++ Builder TCP/IP 网络套接字编程简例:SERVER.CPP:/**************************************************************************本程序为服务器端程序,通信任一方只要发送bye通信过程就自动结束。
在面向连接通信过程中服务器先与端口3000绑定,然后等待客户连接。
连接成功后就可收发信息。
**************************************************************************/#include <condefs.h>#pragma hdrstop//------------------------------------------------------------------------#include <conio.h>#include <stdio.h>#include <winsock2.h>//------------------------------------------------------------------------#pragma argsusedbool InitSocket();int main(int , char**){struct sockaddr addr;int len,off;bool over;char msg[255];SOCKET sock ,sersock;if( !InitSocket() ) return 0; //初始化Window Sockets DLL(ws2_32.dll)//创建流Socket:即传输层使用TCPsock = socket( AF_INET,SOCK_STREAM,0 );if( sock==INV ALID_SOCKET ){ //不能创建,返回printf("不能创建Socket!");getch();WSACleanup( ); //卸载Window Sockets DLLreturn 0;}//设置IP地址和端口号((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议((sockaddr_in*)&addr)->sin_port = htons(3000); //服务器端口号3000 ((sockaddr_in*)&addr)->sin_addr.s_addr = inet_addr("202.195.143.10");//主机地址//把套接字与地址绑定bind(sock,&addr,sizeof(addr));//监听网络连接listen(sock,1); //监听连接:1--允许等待队列的长度printf("等待客户连接!\n");len = sizeof(addr);//接受网络连接,生成新的套接字sersock标识这一连接sersock = accept( sock,&addr,&len );//从等待队列中检取客户,如队列空则进程挂起//如不空,则接受并生成新Socket以表示此连接,而原Socket继续等待新客户if(sersock==INV ALID_SOCKET){DWORD err = WSAGetLastError();char txt[100];sprintf(txt,"error when accept!---errno:%d",err);printf(txt);getch();WSACleanup( ); //卸载Window Sockets DLLreturn 0;}printf("有客户连接!\n输入bye通信结束\n");over = false;do{printf("\n等待用户输入信息......");len = recv ( sersock,msg,200,0 ); //接收用户信息printf("收到信息:%s",msg);if( strcmp(msg,"bye")==0 ){ //若收到bye就结束通信printf(msg);break;}printf("输入信息:");gets(msg);if( strcmp(msg,"bye")==0 ) over = true; //若发出bye就结束通信send ( sersock,msg,strlen(msg)+1,0 ); //发出输入信息}while( !over );//关闭套接字closesocket(sersock);closesocket(sock);printf("按任一键返回");getch();WSACleanup( ); //卸载Window Sockets DLLreturn 0;}//---------------------------------------------------------------------bool InitSocket(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 0 );//初始化Windows Sockets DLL,err = WSAStartup( wVersionRequested, &wsaData );//加载Winsock DLL到内存if ( err != 0 ) {printf("没有Windows Socket动态库!\n");getch();return false;}if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) {printf("需要Windows Socket 2!\n");getch();WSACleanup( ); //非winsock 2.0时,卸载Window Sockets DLLreturn false;}return true;}CLIENT.CPP:/**************************************************************************本程序为客户端程序。