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\n", 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\n");
 33         WSACleanup();
 34         return 1;
 35     }
 36     else
 37         printf("The Winsock 2.2 dll was found okay\n");
 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\n", 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\n");
31         WSACleanup();
32         return 1;
33     }
34     else
35         printf("The Winsock 2.2 dll was found okay\n");
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 }

 

转载于:https://www.cnblogs.com/xiaoyoucai/p/8536010.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值