这一节是计算机网络作业,windows socket编程,老师电脑上开一个服务器程序,公开ip地址和端口号,我们同学自己编写一个客户端,能与老师的服务器建立联系,两者能收发即可。这样的代码网上很多,而是就采用了孙鑫VC++第14讲的代码,下面是添加的一点简单注释。
其实socket完成连接功能很简单,依葫芦画瓢即可。首先来看面向连接的TCP流程图。
面向无连接的UDP流程更加简单,如下所示:
现在用TCP协议来完成任务,下面是孙鑫老师的代码,由于我们要提前测试自己的代码,所以也用了服务器端的代码,服务器端端server代码如下:
1 #include2 #include 3 4 void main() 5 { 6 // 以下的几句都是固定的 7 WORD wVersionRequested; 8 WSADATA wsaData; 9 int err;10 11 wVersionRequested = MAKEWORD( 1, 1 );12 13 err = WSAStartup( wVersionRequested, &wsaData );//该函数的功能是加载一个Winsocket库版本14 if ( err != 0 ) {15 return;16 }17 18 19 if ( LOBYTE( wsaData.wVersion ) != 1 ||20 HIBYTE( wsaData.wVersion ) != 1 ) {21 WSACleanup( );22 return; 23 }24 25 26 //真正socket编程部分27 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//面向连接的可靠性服务SOCK_STRAM28 29 SOCKADDR_IN addrSrv;//存放本地地址信息的30 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htol将主机字节序long型转换为网络字节序31 addrSrv.sin_family=AF_INET;32 addrSrv.sin_port=htons(6001);//htos用来将端口转换成字符,1024以上的数字即可33 34 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将socket绑定到相应地址和端口上35 36 listen(sockSrv,5);//等待队列中的最大长度为537 38 SOCKADDR_IN addrClient;39 int len=sizeof(SOCKADDR);40 41 while(1)42 {43 SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//建立一个新的套接字用于通信,不是前面的监听套接字44 char sendBuf[100];45 sprintf(sendBuf,"Server IP is:%s",46 inet_ntoa(addrClient.sin_addr));//inet_nota函数是将字符转换成ip地址47 send(sockConn,sendBuf,strlen(sendBuf)+1,0);//服务器向客户端发送数据48 49 char recvBuf[100];50 recv(sockConn,recvBuf,100,0);//服务器从客户端接受数据51 printf("%s\n",recvBuf);52 closesocket(sockConn);//关闭socket53 }54 }
客户端client的代码如下:
1 #include2 #include 3 4 void main() 5 { 6 //固定格式 7 WORD wVersionRequested; 8 WSADATA wsaData; 9 int err;10 11 wVersionRequested = MAKEWORD( 1, 1 );12 13 err = WSAStartup( wVersionRequested, &wsaData );14 if ( err != 0 ) {15 return;16 }17 18 19 if ( LOBYTE( wsaData.wVersion ) != 1 ||20 HIBYTE( wsaData.wVersion ) != 1 ) {21 WSACleanup( );22 return; 23 }24 25 //建立通讯socket26 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);27 28 SOCKADDR_IN addrSrv;29 addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.24");//设定需要连接的服务器的ip地址30 addrSrv.sin_family=AF_INET;31 addrSrv.sin_port=htons(6001);//设定需要连接的服务器的端口地址32 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//与服务器进行连接33 34 //接受来自老师的信息35 char recvBuf[100];36 recv(sockClient,recvBuf,100,0);37 printf("来自老师的信息:\n%s\n",recvBuf);38 39 //发送信息给老师40 send(sockClient,"姓名:小明 学号:123456789,IP地址:192.168.1.14!",strlen("姓名:小明 学号:123456789,IP地址:192.168.1.14!")+1,0);41 42 closesocket(sockClient);43 WSACleanup();44 }
模拟运行结果如下:
实验完毕,完全照抄的,呵呵!