TCP客户端 - 服务器SIGPIPE

我正在设计和测试基于TCP套接字(Internet域)的客户端服务器程序。目前,我正在我的本地机器上测试它,并且无法理解以下有关SIGPIPE的信息。 *。 SIGPIPE似乎很随机。它可以是确定性的吗? 第一个测试涉及来自客户端的单个小(25个字符)发送操作以及服务器上的相应接收。同一台机器上的相同代码是否成功运行(SIGPIPE)完全不受我的控制。失败率约为45%(非常高)。那么,我可以以任何方式调整机器以最小化这个。 **。第二轮测试是从客户端向服务器发送40000个小(25个字符)消息(总数据为1MB),然后服务器响应它实际收到的数据总大小。客户端以紧密循环方式发送数据,并且服务器上有一个SINGLE接收呼叫。它仅适用于发送的总数据的最大1200字节,并且再次存在这些非确定性的SIGPIPE,现在约为70%(非常糟糕)。 有人可以建议我的设计有一些改进(可能会在服务器上)。要求是在与服务器建立单个套接字连接之后,客户端应能够通过中等到非常高的数据量发送(每个消息再次大约25个字符)。 我有一种感觉,针对单个接收的多次发送将总是有损且非常低效。我们应该组合消息并仅在一个send()操作中发送。那是唯一的出路吗?     
已邀请:
当您尝试写入未连接的管道/套接字时发送SIGPIPE。为信号安装处理程序将使send()返回错误。
signal(SIGPIPE, SIG_IGN);
或者,您可以为套接字禁用SIGPIPE:
int n = 1;
setsockopt(thesocket, SOL_SOCKET, SO_NOSIGPIPE, &n, sizeof(n));
此外,您提到的数据量不是很高。可能有一个错误导致你的连接意外关闭,给出了一个SIGPIPE。     
引发SIGPIPE是因为您尝试写入已关闭的套接字。这确实表明存在可能的错误,因此请检查您的应用程序是否发生错误并尝试先修复它。 试图掩盖SIGPIPE并不是一个好主意,因为你不知道信号的来源,你可能会掩盖这个错误的其他来源。在多线程环境中,信号是一种可怕的解决方案。 在极少数情况下你无法避免这种情况,你可以屏蔽发送信号。如果在
send()
/
sendto()
上设置
MSG_NOSIGNAL
标志,则会阻止
SIGPIPE
被抬起。如果确实触发了此错误,则
send()
返回-1,
errno
将设置为
EPIPE
。干净又方便。有关详细信息,请参阅
man send
。     

要回复问题请先登录注册