我在两个系统上测试了相同的测试代码(服务器 - 客户端)。在一个中,我得到了一个sigpipe,另一个我没有得到sigpipe。

测试场景如下所示:

客户

  1. 连接到服务器
  2. 从服务器接收数据
  3. 发送数据
  4. 关闭插座

服务器

  1. 接受服务器的连接
  2. 将数据发送给客户
  3. 接收数据
  4. 发送数据
  5. 关闭插座

在一个系统(在同一系统上运行的客户端和服务器)中,SigPipe正在客户端或服务器端随机发生。

但是,在另一个系统中,使用相同的测试代码不会发生此问题。

我想知道断管是否与TCP设置有关。

有帮助吗?

解决方案

您还可以忽略插座中的sigpipe,以防止应用程序崩溃:

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

SD是套接字的位置,您可以在其中接收Sigpipes。

其他提示

SIGPIPE 如果您尝试写入另一端已经关闭的插座,则会提高信号。这里有一个种族条件,如果一个端与另一端试图发送数据的同一时间闭合插座 - 可以在发送之前或之后接收近的通知,这就是为什么 SIGPIPE 是在一个测试环境中而不是另一个测试环境中发生。

通常,插座感知应用程序应忽略 SIGPIPE, ,而是同步处理结果 EPIPE 来自 send().

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top