Loading

监听socket与已连接socket

TCP协议的Socket程序函数调用过程

img

服务端

  • socket():创建socket描述符(socket descriptor),可以通过它来进行一些读写操作。这个socket是主动socket(active socket)
  • bind():
    • IP:绑定IP到socket。根据监听的网卡,可以是一个IP,也可以是多个IP
    • PORT:绑定端口到socket
  • listen():将此socket转变为监听socket : {*,*,本机 IP,本机端口 },并监听客户端通过connect()发出连接请求,进行三次握手建立连接
  • accept():
    • 默认会阻塞进程,拿出一个已经完成的连接进行处理。如果还没有完成,就要继续阻塞
    • 完成处理之后返回一个已连接socket:{ 对端 IP,对端端口,本机 IP,本机端口 }
    • 已连接socket并没有占用新的端口与客户端通信,依然使用的是与监听socket一样的端口号
  • read()/white():accept完成之后,就可以进行网络I/O操作,即类同于普通文件的读写I/O操作

为什么会有了监听socket还需要建立已连接socket

  • 如果只使用监听socket来处理,那么监听socket在阻塞监听客户端连接请求时,同时需要建立{ 本机 IP,本机端口 } : {对端 IP,对端端口},1对多的数据结构,且还需要接受read()/write()处理。聚合多个复杂逻辑的处理与计算机发展逻辑冲突,分层分治才是更优的解决办法
  • 确保职责分工,分层协作,提高服务端性能
    • 监听socket只接受accept()处理
    • 已连接socket只接受read()/write()处理

参考

套接字Socket

监听 socket、已连接 socket

一文让你透彻理解Linux的SOCKET编程(含实例解析)

为什么有监听socket和连接socket,为什么产生两个socket

监听套接字与已连接套接字

socket的accept函数解析以及服务器和多个客户端的端口问题

accept()返回的套接字绑定哪个端口 新旧套接字的联系

socket INADDR_ANY 监听0.0.0.0地址 socket只绑定端口让路由表决定传到哪个ip

多网卡 socket 的bind问题

unix网络编程——ioctl 函数的用法详解

嵌入式Linux下双网口Socket编程

posted @ 2022-01-12 11:34  FynnWang  阅读(3003)  评论(0编辑  收藏  举报