如果TCP服务器和客户机被连接时,我想确定当客户端不再连接。我以为我可以简单地通过尝试将消息发送到客户端和发送一次()与-1返回,然后我就可以推倒插座做到这一点。该工程实施上找到Windows,但我尝试用BSD套接字在Linux上这样做的那一刻,调用send()在服务器端应用程序会导致我的服务器应用程序崩溃,如果客户端不再连接。它甚至没有返回-1 ...只是终止程序。

请解释为什么发生这种情况。由于事先!

有帮助吗?

解决方案

这是由SIGPIPE信号引起的。请参阅 send(2)

  

在发送()函数应如果失败:结果   [EPIPE]      插座关闭写入,或者套接字连接模式和不再连接。在后者的情况下,以及如果套接字类型SOCK_STREAM或SOCK_SEQPACKET和MSG_NOSIGNAL标志没有被设置,则SIGPIPE信号被产生以调用线程。

您可以通过使用MSG_NOSIGNAL标志上send()呼叫,或通过在程序开始时忽略与SIGPIPEsignal(SIGPIPE, SIG_IGN)信号避免这种情况。然后send()函数将返回-1,并设置在errno这种情况EPIPE

其他提示

您需要忽略SIGPIPE信号。如果一个插座上发生的写入错误,使用get SIGPIPE,而信号的默认行为的过程是杀死你的进程。 写在* nix网络代码通常希望:

signal(SIGPIPE,SIG_IGN);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top