【问题标题】:closesocket in parent and child? [duplicate]父母和孩子的closesocket? [复制]
【发布时间】:2021-08-27 09:04:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c windows winsock2


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。不过,我可能有点过早地接受了;该链接表明将 SOCKET 视为可继承是容易出错的,但可能。如果尽管存在问题,我们确实将它们视为可继承的,那么我仍然很高兴看到我最初问题的答案;然后应该在所有进程中调用closesocket,还是只在父进程中调用?
    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 2020-05-26
    • 2015-06-14
    • 2018-01-15
    • 2019-07-26
    • 2011-08-29
    • 2015-08-30
    • 2018-01-29
    相关资源
    最近更新 更多