任何情况下close()优先于shutdown()?

dbe*_*eer 5 c sockets shutdown

我是一个开源项目的开发人员,我一直在服务器上遇到一些问题,认为它已经完全回答了一个套接字(这意味着它已经发送了回复或者为了响应失败而关闭了它)并且客户端被困在轮询().经过一些研究,我发现close()并不总是生成POLLHUP事件,但是shutdown(sock,2)确实生成了POLLHUP事件.

鉴于此,我正在考虑在发生错误处理时添加关闭(sock,2)(除了close()调用).有谁知道这会导致问题的原因?我吠叫错了树吗?我想如果服务器认为套接字已关闭,客户端绝对不应该尝试使用该套接字,我想不出有什么理由不添加它,但我没有使用tcp这么久的关系,并会喜欢一些建议.

Dav*_*rtz 3

您需要弄清楚为什么closeing 套接字不会导致它发生shutdown。最可能的原因是有另一个描述符访问同一端点。仅closeing 最后一个端点会导致隐式shutdown.

你有dup文件描述符吗?你确保它close在所有子进程中都是 d 吗?如果套接字在编辑fork此进程之前位于父进程中,则父进程是否关闭了其副本?