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 }