TCP服务器通信流程

      最后更新:2022-02-16 05:19:04 手机定位技术交流文章

      1.服务器通信模型

      在这里插入图片描述
      tcp服务器
      接电话模型:创建套接字(服务器电话),绑定ip和端口在套接字上(绑定固定电话号码),监听有没有新在连接(监听),接受连接(接听电话),收发数据(读写对socket文件操作)(说话交流),关闭(挂电话)

      说明:一台主机可能多个ip所以得绑定

      说明:客户端不用绑定,系统随机分配一个端口给他

      详细具体过程

      在这里插入图片描述
      在这里插入图片描述

      说明:
      listen监听创建一个已完成队列和未完成队列,未完成队列经过三次握手到达已完成队列中,将服务器变成被动接收模式
      accept从已完成队列中提取连接,得到一个新的已连接套接字,用这个已连接套接字和客户端通信,原来那个套接字只用来处理新的请求和接收新的连接,不用原来的那个通信了。

      已连接套接字端口和ip和原来的监听套接字ip和端口一模一样同等复制
      要服务很多客户端,不止一个
      在这里插入图片描述
      作用:专门分工,提高工作效率,避免一个套接字产生错乱

      函数说明:

      bind函数
      功能:绑定ip和端口在服务器套接字上
      #include <sys/types.h> /* See NOTES */
      #include <sys/socket.h>
      int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
      sockfd:
      socket文件描述符,对应目标套接字
      addr:
      构造出IP地址加端口号,获取服务器ipv4套接字结构体地址
      addrlen:
      sizeof(addr)长度,ipv4结构体的大小
      返回值:
      成功返回0,失败返回-1, 设置errno

      listen函数
      功能:监听是否有连接
      #include <sys/types.h> /* See NOTES */
      #include <sys/socket.h>
      int listen(int sockfd, int backlog);
      sockfd:
      socket文件描述符,socket套接字
      backlog:在这里插入图片描述
      排队建立3次握手队列和刚刚建立3次握手队列的链接数和
      已完成连接数和未完成连接数之和的最大值(一般填128够用了)

      说明:
      查看系统默认backlog
      cat /proc/sys/net/ipv4/tcp_max_syn_backlog

      返回值
      listen()成功返回0,失败返回-1。

      accept函数
      功能:从已完成连接队列提取新的连接
      #include <sys/types.h> /* See NOTES */
      #include <sys/socket.h>
      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
      sockdf:
      socket文件描述符,套接字
      addr:
      传出参数,返回链接客户端地址信息,含IP地址和端口号
      获取到客户端ipv4套接字结构体地址
      addrlen:
      套接字结构体大小的地址
      传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小
      返回值:
      成功返回一个新的socket文件描述符,理解成创建一个新的套接字,用于和客户端通信不用那个旧的套接字
      失败返回-1,设置errno

      说明:如果没有新的连接,accept会阻塞

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/18439.html

          热门文章

          文章分类