C ++中的SIGPIPE确定哪个TCP套接字断开连接

时间:2018-01-12 15:38:24

标签: c++ linux sockets tcp

我使用Linux / Ubuntu。我已经编写了一对分别实现TCP服务器和TCP客户端的类。部分代码是从断开连接中正常恢复。我唯一的问题是SIGPIPE。我已经编写了捕获信号的代码,但是我希望它能够启动"尝试重新连接"处理损坏管道的类实例上的进程。 signal(SIGPIPE,functionname)要求函数名称为C类函数或静态类方法。

如果我在应用程序中有多个类的实例,如何确定SIGPIPE发生了哪个套接字?

1 个答案:

答案 0 :(得分:3)

SIGPIPE对TCP无用。此信号是为shell管道发明的(例如proc_1 | proc_2 | proc_3),因为SIGINT仅传递给shell管道中的最后一个进程。当最后一个进程被终止并且前一个进程尝试写入其stdout时,它会被SIGPIPE终止,因为管道的读取器终止等等,有效地杀死了shell管道中涉及的所有进程。这就是信号名称中包含 pipe 字样的原因。

通常人们在执行TCP时完全忽略SIGPIPE

// Early in main().
signal(SIGPIPE, SIG_IGN);

和/或:

ssize_t rc = send(..., MSG_NOSIGNAL);
if(rc == -1)
    // errno can be EPIPE

这样,您处理senderrno错误的方法就会设置为EPIPE

SIGPIPE被忽略时,没有必要使用MSG_NOSIGNAL,但这仍然是一种很好的做法,IMO。