父母和孩子的closesocket?

问题描述

据我所知,如果您在与 POSIX 相关的系统上创建一个套接字,然后生成一个继承该套接字 fd 的子进程,显然您应该在每个进程中调用 close 在该进程完成后的那个 fd使用它,因为 fd 是内部引用计数,我想引用计数在 fork 上递增,然后 close 再次递减它。

这与 Windows 是否相同,您应该在每个拥有该套接字副本的进程中调用 closesocket,还是只在一个进程中调用它,当所有进程都使用它?

编辑:标记为与此问题重复的问题是相关的 (Are TCP SOCKET handles inheritable?),因为它表明继承 SOCKET 容易出错,但也表明它仍然是可能的.在这种情况下,如果一个人不顾可能的错误而坚持下去,那么如果这个问题有答案就好了;应该在所有进程中使用一个 closesocket,还是只使用父进程?

第二次编辑:我相信在the documentation for WSADuplicateSocketA中回答了这个问题:

进程可以在重复的套接字上调用 closesocket 并且描述符将被释放。然而,底层套接字将保持打开状态,直到最后一个剩余的描述符调用 closesocket。

解决方法

您不应该将 Windows 上的套接字视为文件描述符,因此它们不会以相同的方式被继承。请参阅此链接以获取您问题的完整答案:Are TCP SOCKET handles inheritable?