如何知道远程端是否使用send system调用关闭套接字?

时间:2011-09-19 05:51:28

标签: linux socketserver

即使远程端关闭了连接,send()系统调用也是第一次成功。 如果我再次发送,则会生成sigpipe。 我不想使用recv系统调用来知道远程端是否关闭了连接。

有人可以告诉我如何才能检测远端是否只使用发送系统调用来关闭连接?

1 个答案:

答案 0 :(得分:1)

您应该做的第一件事就是致电signal(SIGPIPE, SIG_IGN);以避免在SIGPIPE上接收send(),或者在Linux上将MSG_NOSIGNAL标记传递给send()。完成此操作后,send()在对等方断开连接时不会生成SIGPIPE信号,而是在errno == EPIPE时返回-1。

发送SIGPIPEwrite()函数的历史行为。 http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html

  

EPIPE尝试写入未通过任何进程读取的管道或FIFO,或只打开一端的管道。 SIGPIPE信号也应发送给线程。

最初它是为shell管道创建的(如cmd | other_cmd)。在shell管道执行期间按下ctrl-c时,只有管道中的最后一个进程收到SIGINT并终止。要终止管道SIGPIPE中的其他进程,会向尝试write()进入STDOUT的读者已被终止的进程发送。