我是一个开源项目的开发人员,我一直在服务器上遇到一些问题,认为它已经完全回答了一个套接字(意味着它已经发送了回复或者为了响应失败而关闭了它)和客户端陷入poll()。经过一些研究,我发现close()并不总是生成POLLHUP事件,但是shutdown(sock,2)确实生成了POLLHUP事件。
鉴于此,我正在考虑在发生错误处理时添加关闭(sock,2)(除了close()调用)。有谁知道这会导致问题的原因?我吠叫错了树吗?我想如果服务器认为套接字已关闭,客户端绝对不应该尝试使用该套接字,我想不出有什么理由不添加它,但我没有使用tcp这种关系很长,并且会喜欢一些建议。
答案 0 :(得分:3)
您需要弄清楚为什么close
套接字没有导致它shutdown
。最可能的原因是存在另一个访问同一端点的描述符。仅close
最后一个端点会导致隐式shutdown
。
你有dup
文件描述符吗?你确定所有子进程中都是close
d吗?如果套接字在fork
进行此过程之前位于父进程中,则父进程是否关闭了副本?
答案 1 :(得分:0)
POLLHUP
不是测试已关闭连接的正确方法。您应该测试文件描述符是否可读并随后返回零长度读取。这是文件结束的定义。