第一次发送后不立即生成SIGPIPE

时间:2012-01-19 10:45:52

标签: c++ sockets tcp send sigpipe

我想知道tcp套接字是否可以立即报告任何损坏的管道错误。目前我正在服务器发生故障时在客户端捕获sigpipe信号...但我发现sigpipe信号已生成 只有在第二个消息从客户端发送到服务器之后。这可能是什么原因?如果另一个套接字端断开,那么第一个发送必须返回sigpipe .. y不是立即产生的信号.. ?? 对这种奇特的行为有什么可能的解释吗?还有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

TCP堆栈只会在重新尝试一定次数后抛出错误。在IIRC中,TCP重传定时器被初始化为少量秒,并且重传次数通常为5-10。该协议不支持任何其他方法来检测在数据交换期间无法访问的对等方(即,有人通过服务器电源线跳闸)。

答案 1 :(得分:0)

我认为使用SO_KEEPALIVE选项可能会加快断链检测。

答案 2 :(得分:0)

  

我想知道tcp套接字是否可以立即报告任何损坏的管道错误

管道的另一端穿过网络。该网络可能缓慢且不可靠。因此,管道的一端无法立即判断其合作伙伴是否仍在那里。延迟可能很长,因此O / S也可能会做一些缓冲。这些考虑使得几乎不可能立即检测到破裂的管道。

  

任何可能的解决方法

但你为什么要这样做?在传输过程中,管道可能随时被打破,因此无论如何你必须处理一般情况。