WinSocket简单编程实验

      这一节是计算机网络作业,windows socket编程,老师电脑上开一个服务器程序,公开ip地址和端口号,我们同学自己编写一个客户端,能与老师的服务器建立联系,两者能收发即可。这样的代码网上很多,而是就采用了孙鑫VC++第14讲的代码,下面是添加的一点简单注释。

      其实socket完成连接功能很简单,依葫芦画瓢即可。首先来看面向连接的TCP流程图。

     

      面向无连接的UDP流程更加简单,如下所示:

     

      现在用TCP协议来完成任务,下面是孙鑫老师的代码,由于我们要提前测试自己的代码,所以也用了服务器端的代码,服务器端端server代码如下:

 1 #include <Winsock2.h>
 2 #include <stdio.h>
 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_STRAM
28 
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);//等待队列中的最大长度为5
37 
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);//关闭socket
53     }
54 }

      客户端client的代码如下:

 1 #include <Winsock2.h>
 2 #include <stdio.h>
 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     //建立通讯socket
26     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 }

      模拟运行结果如下:

     

      实验完毕,完全照抄的,呵呵!

 

 

 

 

 

posted on 2012-04-11 12:45  tornadomeet  阅读(19477)  评论(1编辑  收藏  举报

阿萨德发斯蒂芬