多进程监听同一端口

/

2020-3-2

前言

socket 的概念我们都知道,socket 的本质上是一个四元组,这个四元组为两个节点的 ip 和 port 的组合,唯一标识了一次连接。
有 socket 编程经验的同学知道,当一个 ip:port 被一个进程 listen 过之后,另一个进程再进行 listen 的时候就会报端口被占用的错误,这个时候我们可能会想,多个进程是不能监听同一个端口的,但不急着下结论,我们先搞清楚 Socket 的原理。

Socket 概念

  1. 说 socket 是一个 ip 和 port 构成的四元组,这句话没什么问题,但不全面,socket 本质上是一个内核上的数据结构,这个数据结构包含了 四元组信息,以及两个缓冲队列,一个是发送队列(sendQueue),一个是接收队列(recvQueue),我们在用 socket 进行 send() 和 recv() 的时候,其实就是操作这两个队列。

  1. 那我们是如何操作这两个队列的呢?答案是文件描述符,我们通过文件描述符来间接操作这两个队列。对于进程来说,socket 和普通的文件没什么区别。

多进程与Socket

  1. 既然 socket 对进程来说就是一个文件描述符,那熟悉父子进程的同学们知道,子进程会继承父进程的文件描述符。那自然多个进程持同一个socket的文件描述符是可行的。如果两者同时read(),会发生什么呢?



通过实践我们发现,多进程同时从 socket 中 read,并没有什么的规律,是竞争调度的结果

Reproduced please indicate the author and the source, and error a link to this page.
text link: //sealbaby.cn/17