是否有任何 TCP 设置会影响 SIGPIPE?
Posted
技术标签:
【中文标题】是否有任何 TCP 设置会影响 SIGPIPE?【英文标题】:Does any of the TCP Settings impact SIGPIPE? 【发布时间】:2011-01-20 06:16:55 【问题描述】:我在两个系统上测试了相同的测试代码(服务器 - 客户端)。在一个我得到一个 SIGPIPE,在另一个我没有得到 SIGPIPE。
测试场景如下:
客户
-
连接到服务器
从服务器接收数据
发送数据
关闭套接字
服务器
-
接受来自服务器的连接
向客户端发送数据
接收数据
发送数据
关闭套接字
在一个系统中(客户端和服务器在同一系统上运行),SIGPIPE 随机发生在客户端或服务器端。
但是,在另一个系统中,同样的测试代码不会出现这个问题。
我想知道管道损坏是否与 TCP 设置有关。
【问题讨论】:
【参考方案1】:您也可以忽略来自套接字的 SIGPIPE,以防止应用程序崩溃:
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
其中 sd 是您接收 SIGPIPE 的套接字。
【讨论】:
您也可以将sendto
与MSG_NOSIGNAL
标志一起使用,它是无状态的。【参考方案2】:
如果您尝试写入另一端已经关闭的套接字,则会引发SIGPIPE
信号。这里有一个竞争条件,如果一端在另一端尝试发送数据的同时关闭套接字 - 可能在发送之前或之后收到关闭通知,这就是为什么 SIGPIPE
在一个测试中发生环境而不是其他。
通常,套接字感知应用程序应忽略SIGPIPE
,而是同步处理来自send()
的EPIPE
错误。
【讨论】:
以上是关于是否有任何 TCP 设置会影响 SIGPIPE?的主要内容,如果未能解决你的问题,请参考以下文章