如何在tcp socket的BLOCKING模式下感觉不那么痛苦?

时间:2014-04-17 04:02:32

标签: linux sockets tcp

出于某种原因,我们的程序为tcp socket选择了BLOCKING模式,我知道这是一个糟糕的设计,但我现在不能做太多修改。

问题是,当对等设备断电时,我们程序中的recv呼叫将挂起,是否有解决方法? SO_KEEPALIVE选项是帮助还是我必须实施一些心跳机制?

感谢。

2 个答案:

答案 0 :(得分:1)

在套接字上设置读取超时。由于您还没有指定语言,因此无法确切地告诉您如何,但在基础级别它是套接字选项SO_RCVTIMEO。如果发生这种情况,请使其长度足以使其成为对等故障。

答案 1 :(得分:0)

您可以尝试以下方法:

确定为什么很难将套接字转为非阻塞模式。什么阻止你改变糟糕的设计?害怕过多的修改和更大的熵,它可能会打破有用的东西?我会推荐一个设计修复而不是它。

TCP KEEP-ALIVE是确定对等方是否可用的选项。

如果您可以修改对等应用程序代码,那么应用程序级别交换心跳应该会有所帮助。但是如何在没有计时器的情况下摆脱阻塞的recv()?因此下一个。

防止插座上的永久阻塞。在for send()和recv()中设置超时。