Tcp网络通信的基本流程梳理

打印 上一主题 下一主题

主题 997|帖子 997|积分 2991

先来一张经典的流程图


接下介绍一下大概流程,各个函数的参数大家本身去相识加深一下印象

服务端流程


 1.创建套接字:利用 socket 函数创建一个套接字,这个套接字后续会被用于监听客户端的连接请求。   需要留意的是,服务端一样寻常有俩个描述符,一个用于连接和监听,一个用于通信,这里用socket 函数创建的套接字就是用于和客户端建立连接和监听客户端的连接请求的
例如在 C 语言中:


  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. int main() {
  6.     int listenSocket = socket(AF_INET, SOCK_STREAM, 0);
  7.     if (listenSocket == -1) {
  8.         perror("socket creation failed");
  9.         return -1;
  10.     }
  11.     // 后续操作
  12.     return 0;
  13. }
复制代码

2.绑定所在和端口:利用 bind 函数将创建的套接字与指定的 IP 所在和端口举行绑定,向操作系统表明服务端要监听该所在和端口上的连接请求。示例如下:
  1. struct sockaddr_in serverAddr;
  2. serverAddr.sin_family = AF_INET;
  3. serverAddr.sin_addr.s_addr = INADDR_ANY; // 监听所有可用网络接口
  4. serverAddr.sin_port = htons(8888); // 绑定到 8888 端口
  5. if (bind(listenSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
  6.     perror("bind failed");
  7.     close(listenSocket);
  8.     return -1;
  9. }
复制代码
为什么bind绑定时肯定要将套接字和服务器的ip和端口绑定在一起呢?我的明白是客户端相当于一个想入住酒店的游客,套接字就相当于房卡,有了这张房卡游客才气知道楼层和详细房间在那边。

3.监听连接请求:利用 listen 函数将套接字设置为监听状态,指定最大允许的连接请求队列长度。
示例如下:
  1. if (listen(listenSocket, 5) == -1) {
  2.     perror("listen failed");
  3.     close(listenSocket);
  4.     return -1;
  5. }
复制代码

4.担当连接并创建新套接字:利用 accept 函数担当客户端的连接请求。当有客户端发起连接时,accept 函数会阻塞直到有连接到来,然后返回一个新的套接字用于与该客户端举行数据通信,同时获取客户端的所在信息(包括 IP 所在和端标语)。示例如下:

  1. struct sockaddr_in clientAddr;
  2. socklen_t clientAddrLen = sizeof(clientAddr);
  3. int clientSocket = accept(listenSocket, (struct sockaddr *)&clientAddr, &clientAddrLen);
  4. if (clientSocket == -1) {
  5.     perror("accept failed");
  6.     close(listenSocket);
  7.     return -1;
  8. }
复制代码
客户端流程


1.创建套接字:同样利用 socket 函数创建一个套接字,用于与服务端建立连接和举行数据通信。示例如下:

  1. int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
  2. if (clientSocket == -1) {
  3.     perror("socket creation failed");
  4.     return -1;
  5. }
复制代码

2.发起连接请求:利用 connect 函数向服务端发起连接请求,在 connect 函数中指定服务端的 IP 所在和端标语。示例如下:

  1. struct sockaddr_in serverAddr;
  2. serverAddr.sin_family = AF_INET;
  3. serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务端 IP 地址
  4. serverAddr.sin_port = htons(8888); // 服务端端口
  5. if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
  6.     perror("connect failed");
  7.     close(clientSocket);
  8.     return -1;
  9. }
复制代码

3.数据通信:连接建立后,客户端通过本身创建的套接字 clientSocket 与服务端 accept 返回的用于通信的新套接字举行数据交互,利用 send 函数发送数据,利用 recv 函数吸取数据。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表