如何在分叉进程中处理套接字连接

时间:2011-05-16 06:54:32

标签: sockets process tcp fork port

我有一个程序,用作侦听端口5000的TCP服务器。

现在我想运行另一个命令行进程与该服务器并行运行。我知道正确的方法是分叉服务器,而不是调用“exec”....

我的问题是,子进程是否也“拥有”这个端口5000?如果我想释放这个端口5000,我是否需要杀死父进程和子进程?

我很好奇如何在分叉中处理这个套接字连接。

2 个答案:

答案 0 :(得分:24)

  1. 首先,accept()传入连接。接受进程现在有一个侦听套接字句柄和新接受的套接字。
  2. 叉子和:
    • 在孩子身上:
      1. 关闭侦听套接字。
      2. 使用已接受的套接字执行操作。
    • 在父母:
      1. 关闭已接受的套接字。
      2. 恢复接受循环。
  3. 当关闭对句柄的所有引用时,将回收各种套接字资源。如果进程终止,则隐式关闭其所有句柄。因此,如果一个子关闭它继承到侦听套接字的句柄,则该父接口中存在该套接字剩余的唯一句柄。然后,当父节点终止时,将回收侦听套接字,或者显式关闭此句柄。

答案 1 :(得分:18)

是的,确实如此 无论何时创建子进程,它都会从父进程获取文件描述符表的副本。并且存在与每个文件描述符相对应的引用计数,即当前访问文件/套接字的进程数。因此,如果套接字在主进程中打开并且创建了子进程,则引用计数也会递增,因为它现在也在子进程中打开,并且当它在任何进程中关闭时,它会递减。当引用计数达到零时,套接字最终关闭。