Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP发送不返回导致进程崩溃_Tcp_Sockets_Crash_Send - Fatal编程技术网

TCP发送不返回导致进程崩溃

TCP发送不返回导致进程崩溃,tcp,sockets,crash,send,Tcp,Sockets,Crash,Send,如果tcp服务器和客户端已连接,我想确定客户端何时不再连接。我想我可以通过尝试向客户机发送消息来实现这一点,一旦send()返回-1,我就可以拆下套接字。此实现在Windows上有效,但当我尝试在Linux上使用BSD套接字执行此操作时,如果客户端不再连接,服务器端应用程序上对send()的调用会导致服务器应用程序崩溃。它甚至不返回-1…只是终止程序 请解释为什么会发生这种情况。提前谢谢 这是由SIGPIPE信号引起的。见: 如果: [主旨] 套接字已关闭以进行写入,或者套接字处于连接模式且不再

如果tcp服务器和客户端已连接,我想确定客户端何时不再连接。我想我可以通过尝试向客户机发送消息来实现这一点,一旦send()返回-1,我就可以拆下套接字。此实现在Windows上有效,但当我尝试在Linux上使用BSD套接字执行此操作时,如果客户端不再连接,服务器端应用程序上对send()的调用会导致服务器应用程序崩溃。它甚至不返回-1…只是终止程序


请解释为什么会发生这种情况。提前谢谢

这是由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);