我想知道 tcp socket 是否有可能立即报告任何损坏的管道错误。目前,当服务器出现故障时,我正在客户端捕获 sigpipe 信号......但我发现只有在从客户端向服务器发送第二个 msg 后才会生成 sigpipe 信号。这可能是什么原因?如果另一个套接字端出现故障,那么第一次发送必须返回 sigpipe .. y 不是立即生成的信号..?? 这种特殊行为有什么可能的解释吗?以及任何可能的方法来解决这个问题?
问问题
518 次
3 回答
1
TCP 堆栈只会在重传尝试数次后抛出错误。IIRC,TCP 重传计时器被初始化为一些小秒数,重传次数通常为 5-10。该协议不支持任何其他检测在数据交换期间变得无法访问的对等方的方法(例如,有人绊倒了服务器电源线)。
于 2012-01-19T12:23:07.777 回答
0
我认为使用SO_KEEPALIVE
选项可以加快断开链接的检测。
于 2012-01-19T10:57:29.007 回答
0
我想知道 tcp socket 是否有可能立即报告任何损坏的管道错误
管道的另一端穿过网络。该网络可能很慢且不可靠。因此,管道的一端永远无法立即判断其伙伴是否还在。延迟可能会很长,因此 O/S 也可能会做一些缓冲。这些考虑使得几乎不可能立即检测到破裂的管道。
以及任何可能的方法来解决这个问题
但你为什么想要?在传输过程中,管道随时可能破裂,因此您无论如何都必须处理一般情况。
于 2012-01-19T13:44:45.973 回答