• 74)搭建TCP服务器


    补充:

        1-->listen是监听,就是监听你建立的那个socket那个窗口,要是有客户端来了,那么就把他加到 队列里面,然后accept是从队列中取客户端(就是把对应的客人的信息拿过来,交给waiter,它是accept的返回值)

        2-->要是我在监听函数listen后面加上while(1),那么 客户端能够连接上我的服务器吗?====>  答案是能。因为监听是 等客户端来连接,他把客人都放到自己的队列里,而accept是从队列中把客人的信息取出来交给waiter

                              我们虽然没有取客人的过程,但是客人是能接到,只不过接下来服务器和客户端的沟通处理不了了

                        但是我将我的listen(,最大监听数量n) 这个最大监听数量改成1,那么只能有一个客户端能连上服务器,这个n就是服务器能同时连接的最多客户端数量

        3-->listen是往队列中放,accept是从队列中往外取

        4-->那么在listen和accept之间发生了什么?

                TCP连接过程称为 三次握手-->

                              

                        三次握手成功之后,这两个才能通信

          5-->TCP协议头:

            

                      窗口尺寸是因为  TCP有 流量机制 

                 ~~~~~~~~~~~~~~~~~~~~~~~~·

                      

                TCP那个图,有一个生存周期(8),这个参数  规定,没经过一个路由器  这个参数就减一

           5--->链路层最少需要18个字节,帧头14个字节,帧尾4个字节

                   

          6--->滑动窗口:
            

                  

          7--->TCP断开连接,就是分手过程-->就是四次挥手

      

                  

         8-->

                  

    基本步骤和搭建UDP服务器步骤一样:
         基本步骤:
          

     1 我们假设成  我们卖东西
     2 
     3 第一步加载库
     4 
     5 第二步  找个店长卖东西 --->创建socket
     6 
     7 第三步  找个店地   -->绑定bind
     8 
     9 第四步  店长去店门口看  去宣传  有没有人来  --->监听listen
    10 
    11 第五步  人来了  接客  ,交给服务员   --->accept
    12 
    13 第六步  服务员和这个顾客进行对话-->send   和recv
      
      第七步 然后就是 关闭套接字
      
      第八步 卸载库

    然后  我们基本的代码;
        

      

      1 //其实步骤和UDP差不多
      2 
      3 #include<iostream>
      4 #include<Winsock2.h>
      5 
      6 
      7 using namespace std;
      8 
      9 #pragma comment(lib, "ws2_32.lib")
     10 
     11 int main()
     12 {
     13 
     14     //第一步
     15     WORD wVersionRequested;
     16     WSADATA wsaData;
     17     int err;
     18 
     19 
     20     wVersionRequested = MAKEWORD(2, 2);
     21 
     22     err = WSAStartup(wVersionRequested, &wsaData);
     23     if (err != 0) {
     24         printf("WSAStartup failed with error: %d
    ", err);
     25         return 1;
     26     }
     27 
     28 
     29 
     30     if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
     31                                      
     32         printf("Could not find a usable version of Winsock.dll
    ");
     33         WSACleanup();
     34         return 1;
     35     }
     36     else
     37         printf("The Winsock 2.2 dll was found okay
    ");
     38         
     39     //第二步:
     40 
     41         SOCKET  sock=socket(AF_INET ,SOCK_STREAM,IPPROTO_TCP );
     42         if(sock==INVALID_SOCKET)
     43         {
     44             WSACleanup();
     45             return 1;
     46         }
     47 
     48     //第三步
     49 
     50         sockaddr_in  server_addr;
     51         server_addr.sin_family=AF_INET;
     52         server_addr.sin_port=htons(1234);
     53         server_addr.sin_addr.S_un.S_addr=inet_addr("192.168.3.221");
     54 
     55         //第四步
     56         if(bind(sock,(const sockaddr*)&server_addr,sizeof(server_addr))==SOCKET_ERROR)
     57         {
     58             closesocket(sock);
     59             WSACleanup();
     60             return 1;
     61         }
     62     //第五步
     63 
     64         if(SOCKET_ERROR ==listen(sock,10))
     65         {
     66             closesocket(sock);
     67             WSACleanup();
     68             return 1;
     69         }
     70     
     71         //第六步
     72 
     73         sockaddr_in rec_addr;
     74         SOCKET sock_waiter;
     75         int size=sizeof(rec_addr);
     76         sock_waiter=accept(sock,(sockaddr*)&rec_addr,&size);
     77         if(sock_waiter==INVALID_SOCKET)
     78         {
     79             closesocket(sock);
     80             WSACleanup();
     81             return 1;
     82         }
     83 
     84         //第七步
     85         char rec_buffer[1024]={0};
     86         if(recv(sock_waiter,rec_buffer,sizeof(rec_buffer),0)>0)
     87         {
     88             cout<<rec_buffer<<endl;
     89             cin>>rec_buffer;
     90             send(sock_waiter,rec_buffer,sizeof(rec_buffer),0);
     91         }
     92         
     93         //第八步
     94 
     95         closesocket(sock);
     96         closesocket(sock_waiter);
     97             WSACleanup();
     98             return 1;
     99 
    100 
    101 
    102 
    103 
    104 
    105     system("pause");
    106     return 0;
    107 }

    具体不懂的看手册

     然后 这里还有一饿客户端的代码:

     1 #include<iostream>
     2 #include<Winsock2.h>
     3 
     4 
     5 using namespace std;
     6 
     7 #pragma comment(lib, "ws2_32.lib")
     8 
     9 int main()
    10 {
    11 
    12     //第一步
    13     WORD wVersionRequested;
    14     WSADATA wsaData;
    15     int err;
    16 
    17 
    18     wVersionRequested = MAKEWORD(2, 2);
    19 
    20     err = WSAStartup(wVersionRequested, &wsaData);
    21     if (err != 0) {
    22         printf("WSAStartup failed with error: %d
    ", err);
    23         return 1;
    24     }
    25 
    26 
    27 
    28     if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
    29                                      
    30         printf("Could not find a usable version of Winsock.dll
    ");
    31         WSACleanup();
    32         return 1;
    33     }
    34     else
    35         printf("The Winsock 2.2 dll was found okay
    ");
    36         
    37     //第二步:
    38 
    39         SOCKET  sock=socket(AF_INET ,SOCK_STREAM,IPPROTO_TCP );
    40         if(sock==INVALID_SOCKET)
    41         {
    42             WSACleanup();
    43             return 1;
    44         }
    45 
    46     //第三步
    47 
    48             sockaddr_in clientService;
    49             clientService.sin_family = AF_INET;
    50             clientService.sin_addr.s_addr = inet_addr("192.168.3.153");
    51             clientService.sin_port = htons(1234);
    52 
    53             connect(sock,(SOCKADDR *) & clientService, sizeof (clientService));
    54 
    55 
    56         //第七步
    57         char rec_buffer[1024]={0};
    58         
    59             
    60             cin>>rec_buffer;
    61             send(sock,rec_buffer,sizeof(rec_buffer),0);
    62             recv(sock,rec_buffer,sizeof(rec_buffer),0);
    63             cout<<rec_buffer<<endl;
    64         
    65         //第八步
    66 
    67             closesocket(sock);
    68             WSACleanup();
    69             return 1;
    70 
    71 
    72 
    73 
    74 
    75 
    76     system("pause");
    77     return 0;
    78 }
  • 相关阅读:
    吴恩达《机器学习》第四章:多元线性回归
    吴恩达《机器学习》第三章:矩阵和向量
    吴恩达《机器学习》第二章:线性回归
    吴恩达《机器学习》第一章:监督学习和无监督学习
    初学Go语言的学生管理系统
    vscode如何自定义补全内容,自定义常用的快捷方式?
    vscode配置Golang环境所需的bin文件夹(各种包)
    Google浏览器一开启就提示“请停用以开发者模式运行的扩展程序“解决方案
    一道把递归、链表、引用、双指针都结合的题——回文链表
    grep
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8536010.html
Copyright © 2020-2023  润新知