我正在开发一个应用程序,我需要确保即使网络出现故障,消息仍然可靠,有序和未修改地到达目的地。我一直在使用TCP,到目前为止,我只是采用了以下策略:
如果发送/接收失败,请再次执行,直到没有错误。
如果遥控器断开连接,请等到下一次连接并将我发送/接收的插座替换为新的插座(通过一些线程和阻塞来实现,以确保它干净地交换)。
我最近意识到这不起作用,因为send
无法报告指示遥控器未收到消息的错误(引用例如。here)。
我还了解到,TCP连接可以在短暂的网络中断后继续存在,因为内核会缓冲数据包,直到连接在超时期限后被宣布为死(引用。 here)。
问题:在客户端/服务器端(使用setsockopt
和SO_KEEPALIVE
选项)将超时时间设置得更高是一种可行的策略,以便连接“永不超时” “?我必须处理与内核缓冲区填充相关的错误,但这应该相对简单。
还有其他失败案例吗?
答案 0 :(得分:1)
如果两端没有明确断开连接,即使拔掉电缆,tcp连接仍会保持永久。 TCP中没有超时。
但是,我会在tcp之上使用(或设计)应用程序协议,从而可以在重新连接后恢复数据传输。例如,您可以使用HTTP。
那会更加稳定,因为根据缓冲区的不同,正如你所说,在某些时候耗尽缓冲区,但缓冲区也会因为断电而丢失。