Dan*_*nny 8 sockets crash tcp send
如果连接了tcp服务器和客户端,我想确定客户端何时不再连接.我以为我可以通过尝试向客户端发送消息来做到这一点,一旦send()返回-1,我就可以拆掉套接字.这个实现在Windows上可以找到,但是当我尝试在带有BSD套接字的Linux上执行此操作时,在服务器端应用程序上调用send()会导致我的服务器应用程序在客户端不再连接时崩溃.它甚至没有返回-1 ...只是终止程序.
请解释为什么会这样.提前致谢!
mar*_*k4o 15
这是由SIGPIPE信号引起的.见send(2):
send(2)
如果出现以下情况,send()函数将失败: [EPIPE]套接字因写入而关闭,或套接字处于连接模式且不再连接.在后一种情况下,如果套接字的类型为SOCK_STREAM或SOCK_SEQPACKET且未设置MSG_NOSIGNAL标志,则向调用线程生成SIGPIPE信号.
您可以通过使用呼叫MSG_NOSIGNAL上的标志send()或忽略程序开头的SIGPIPE信号来避免这种情况signal(SIGPIPE, SIG_IGN).然后该send()函数将返回-1并在此情况下设置errno为EPIPE.
MSG_NOSIGNAL
send()
SIGPIPE
signal(SIGPIPE, SIG_IGN)
errno
EPIPE
归档时间:
16 年,9 月 前
查看次数:
3635 次
最近记录: