• 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 }

          模拟运行结果如下:

         

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

     

     

     

     

  • 相关阅读:
    python--logging库学习_第一波
    花瓶并发请求的方法
    adb命令记录
    设置苹果机参数
    Appium 服务命令行参数
    sdk下载地址
    Monkey记录
    花瓶使用笔记 (抓数据时,记得添加host,不然抓不了包的)
    selenium笔记2017
    Mac安装appium 问题记录
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2442140.html
Copyright © 2020-2023  润新知