题
如果TCP服务器和客户机被连接时,我想确定当客户端不再连接。我以为我可以简单地通过尝试将消息发送到客户端和发送一次()与-1返回,然后我就可以推倒插座做到这一点。该工程实施上找到Windows,但我尝试用BSD套接字在Linux上这样做的那一刻,调用send()在服务器端应用程序会导致我的服务器应用程序崩溃,如果客户端不再连接。它甚至没有返回-1 ...只是终止程序。
请解释为什么发生这种情况。由于事先!
解决方案
这是由SIGPIPE信号引起的。请参阅 send(2)
:
在发送()函数应如果失败:结果 [EPIPE] 插座关闭写入,或者套接字连接模式和不再连接。在后者的情况下,以及如果套接字类型SOCK_STREAM或SOCK_SEQPACKET和MSG_NOSIGNAL标志没有被设置,则SIGPIPE信号被产生以调用线程。
您可以通过使用MSG_NOSIGNAL
标志上send()
呼叫,或通过在程序开始时忽略与SIGPIPE
的signal(SIGPIPE, SIG_IGN)
信号避免这种情况。然后send()
函数将返回-1,并设置在errno
这种情况EPIPE
。
其他提示
您需要忽略SIGPIPE信号。如果一个插座上发生的写入错误,使用get SIGPIPE,而信号的默认行为的过程是杀死你的进程。 写在* nix网络代码通常希望:
signal(SIGPIPE,SIG_IGN);
不隶属于 StackOverflow