监听socket与已连接socket
TCP协议的Socket程序函数调用过程
服务端
- 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
socket的accept函数解析以及服务器和多个客户端的端口问题