一个端口号真的只能被一个进程bind吗?

  • 不经意间我看见了这个问题,刚好这学期我就在学谢仁希的计算机网络这门课,书上说一个端口号只能被一个进程绑定的。网上关于这个问题的详细解释也是寥寥无几。直到我看见了有位博主说绑定端口号后fork会导致父子进程绑定了同一个端口,博主也是一句话带过,也没有具体解释,下来我也是问了许多老师,不断的通过代码来验证自己的想法和观点。
  • 以下测试均在Linux环境下。
  1. 首先我们需要一个简单的服务器和客户端程序,我们将服务器代码改动一下,在listen之后,accept之前我们fork,创建一个子进程,父子进程此刻执行相同的代码。
    在这里插入图片描述

  2. 然后启动服务器程序
    在这里插入图片描述

  3. 查看父子进程状态,以及连接状态
    在这里插入图片描述
    通过指令可以看见父子进程均正常运行,但是只能看见父进程处于listen状态,而看不见子进程的连接状态(此时感觉子进程好像并没有和父进程同时绑定了同一个端口号,因为看不见子进程处于listen状态)

  4. 开启一个客户端程序连接服务器,然后我们再来查看进程信息
    在这里插入图片描述
    可以看见父进程和该客户端三次握手成功,已经连接成功

  5. 然后开启第二个客户端程序连接该服务器,再查看进程信息
    在这里插入图片描述

  • 这里我们发现第二个客户端程序居然和子进程三次握手成功,连接成功了,这验证了父子进程的确绑定了同一个端口号。

  • 这的确是一个例外,父进程在没有被连接上时,子进程此时并没有被唤醒,当第二个客户端请求链接时子进程就被唤醒,和该客户端三次握手了

  • 两个客户端程序均可正常的向服务器两个进程请求数据,也就验证了一个端口号在这种情况下的确是可以绑定两个进程

  • 学无止境啊~

发布了161 篇原创文章 · 获赞 52 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_42837885/article/details/103565409