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

标签 c++ linux sockets tcp

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

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

最佳答案

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

这样您只需处理来自 send 的错误,并将 errno 设置为 EPIPE

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

关于c++ - C++ 中的 SIGPIPE 确定哪个 TCP 套接字已断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229430/

相关文章:

linux - xterm 退出后在终端中保留页面

linux - 仅使用 -r Grep 性能 : using -ri vs.

c# - 写入文件仅在 "step in" Debug模式下有效?

ios - 使用 Socket.io 无法在两个 IOS 设备之间接收消息

c++ - 错误 LNK2005 : constructor already defined

C++类型转换

c++ - 在没有管理员权限的情况下以 C++ 编程方式将程序添加到启动

linux - 如何设置全局 nofile 限制以避免 "many open files"错误?

java - 什么是实现套接字的好方法?

c++ - 在优先级最低的核心中运行一个线程