TCP客户端 - 服务器SIGPIPE

foo*_*ose 4 tcp sigpipe

我正在设计和测试基于TCP套接字(Internet域)的客户端服务器程序.目前,我正在我的本地机器上测试它,并且无法理解以下有关SIGPIPE的信息.

*.SIGPIPE似乎很随机.它可以是确定性的吗?

第一个测试涉及来自客户端的单个小(25个字符)发送操作以及服务器上的相应接收.同一台机器上的相同代码是否成功运行(SIGPIPE)完全不受我的控制.失败率约为45%(非常高).那么,我可以以任何方式调整机器以最小化这个.

**.第二轮测试是从客户端向服务器发送40000个小(25个字符)消息(总数据为1MB),然后服务器响应它实际收到的数据总大小.客户端以紧密循环方式发送数据,并且在服务器上有一个SINGLE接收呼叫.它仅适用于发送的总数据的最大1200字节,并且再次存在这些非确定性的SIGPIPE,现在约为70%(非常糟糕).

有人可以建议我的设计有一些改进(可能会在服务器上).要求是在与服务器建立单个套接字连接之后,客户端应能够通过中等到非常高的数据量发送(每个消息再次大约25个字符).我有一种感觉,针对单个接收的多次发送将总是有损且非常低效.我们应该组合消息并仅在一个send()操作中发送.那是唯一的出路吗?

Eri*_*rik 8

当您尝试写入未连接的管道/套接字时发送SIGPIPE.为信号安装处理程序将使send()返回错误.

signal(SIGPIPE, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)

或者,您可以为套接字禁用SIGPIPE:

int n = 1;
setsockopt(thesocket, SOL_SOCKET, SO_NOSIGPIPE, &n, sizeof(n));
Run Code Online (Sandbox Code Playgroud)

此外,您提到的数据量不是很高.可能有一个错误导致你的连接意外关闭,给出了一个SIGPIPE.