出于某种原因,我们的程序为tcp socket选择了BLOCKING模式,我知道这是一个糟糕的设计,但我现在不能做太多修改。
问题是,当对等设备断电时,我们程序中的recv呼叫将挂起,是否有解决方法? SO_KEEPALIVE选项是帮助还是我必须实施一些心跳机制?
感谢。
答案 0 :(得分:1)
在套接字上设置读取超时。由于您还没有指定语言,因此无法确切地告诉您如何,但在基础级别它是套接字选项SO_RCVTIMEO。如果发生这种情况,请使其长度足以使其成为对等故障。
答案 1 :(得分:0)
您可以尝试以下方法:
确定为什么很难将套接字转为非阻塞模式。什么阻止你改变糟糕的设计?害怕过多的修改和更大的熵,它可能会打破有用的东西?我会推荐一个设计修复而不是它。
TCP KEEP-ALIVE是确定对等方是否可用的选项。
如果您可以修改对等应用程序代码,那么应用程序级别交换心跳应该会有所帮助。但是如何在没有计时器的情况下摆脱阻塞的recv()?因此下一个。
防止插座上的永久阻塞。在for send()和recv()中设置超时。