TCP发送不返回导致进程崩溃
如果tcp服务器和客户端已连接,我想确定客户端何时不再连接。我想我可以通过尝试向客户机发送消息来实现这一点,一旦send()返回-1,我就可以拆下套接字。此实现在Windows上有效,但当我尝试在Linux上使用BSD套接字执行此操作时,如果客户端不再连接,服务器端应用程序上对send()的调用会导致服务器应用程序崩溃。它甚至不返回-1…只是终止程序TCP发送不返回导致进程崩溃,tcp,sockets,crash,send,Tcp,Sockets,Crash,Send,如果tcp服务器和客户端已连接,我想确定客户端何时不再连接。我想我可以通过尝试向客户机发送消息来实现这一点,一旦send()返回-1,我就可以拆下套接字。此实现在Windows上有效,但当我尝试在Linux上使用BSD套接字执行此操作时,如果客户端不再连接,服务器端应用程序上对send()的调用会导致服务器应用程序崩溃。它甚至不返回-1…只是终止程序 请解释为什么会发生这种情况。提前谢谢 这是由SIGPIPE信号引起的。见: 如果: [主旨] 套接字已关闭以进行写入,或者套接字处于连接模式且不再
请解释为什么会发生这种情况。提前谢谢 这是由SIGPIPE信号引起的。见: 如果:
[主旨] 套接字已关闭以进行写入,或者套接字处于连接模式且不再连接。在后一种情况下,如果套接字的类型为SOCK_STREAM或SOCK_SEQPACKET,并且未设置MSG_NOSIGNAL标志,则会向调用线程生成SIGPIPE信号
通过在
send()
调用上使用MSG\u NOSIGNAL
标志,或者在程序开始时忽略SIGPIPE
信号和signal(SIGPIPE,SIG\u IGN)
,可以避免这种情况。在这种情况下,send()
函数将返回-1并将errno
设置为EPIPE
。您需要忽略信号管信号。如果套接字上发生写入错误,进程将使用get-SIGPIPE,该信号的默认行为是终止进程。
在您通常需要的*nix上编写网络代码:
signal(SIGPIPE,SIG_IGN);