题
我在两个系统上测试了相同的测试代码(服务器 - 客户端)。在一个中,我得到了一个sigpipe,另一个我没有得到sigpipe。
测试场景如下所示:
客户
- 连接到服务器
- 从服务器接收数据
- 发送数据
- 关闭插座
服务器
- 接受服务器的连接
- 将数据发送给客户
- 接收数据
- 发送数据
- 关闭插座
在一个系统(在同一系统上运行的客户端和服务器)中,SigPipe正在客户端或服务器端随机发生。
但是,在另一个系统中,使用相同的测试代码不会发生此问题。
我想知道断管是否与TCP设置有关。
解决方案
您还可以忽略插座中的sigpipe,以防止应用程序崩溃:
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
SD是套接字的位置,您可以在其中接收Sigpipes。
其他提示
这 SIGPIPE
如果您尝试写入另一端已经关闭的插座,则会提高信号。这里有一个种族条件,如果一个端与另一端试图发送数据的同一时间闭合插座 - 可以在发送之前或之后接收近的通知,这就是为什么 SIGPIPE
是在一个测试环境中而不是另一个测试环境中发生。
通常,插座感知应用程序应忽略 SIGPIPE
, ,而是同步处理结果 EPIPE
来自 send()
.
不隶属于 StackOverflow