【问题标题】:Does any of the TCP Settings impact SIGPIPE?是否有任何 TCP 设置会影响 SIGPIPE?
【发布时间】:2011-01-20 06:16:55
【问题描述】:

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

测试场景如下:

客户

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

服务器

  1. 接受来自服务器的连接
  2. 向客户端发送数据
  3. 接收数据
  4. 发送数据
  5. 关闭套接字

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

但是,在另一个系统中,同样的测试代码不会出现这个问题。

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

【问题讨论】:

    标签: c linux sigpipe


    【解决方案1】:

    您也可以忽略来自套接字的 SIGPIPE,以防止应用程序崩溃:

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

    其中 sd 是您接收 SIGPIPE 的套接字。

    【讨论】:

    • 您也可以将sendtoMSG_NOSIGNAL 标志一起使用,它是无状态的。
    【解决方案2】:

    如果您尝试写入另一端已经关闭的套接字,则会引发SIGPIPE 信号。这里有一个竞争条件,如果一端在另一端尝试发送数据的同时关闭套接字 - 可能在发送之前或之后收到关闭通知,这就是为什么 SIGPIPE 在一个测试中发生环境而不是其他。

    通常,套接字感知应用程序应忽略SIGPIPE,而是同步处理来自send()EPIPE 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多