我工作的一个应用程序,我需要确保即使在网络中断时,消息仍将到达他们的目的地可靠,有序,和不变。我一直在使用TCP,而到现在为止,我只是使用的策略:TCP:提高可靠性与断开连接
如果发送/接收失败,做一遍,直到没有错误。
如果远程连接断开,请等到下一次连接,然后用这个新连接替换我发送/接收的套接字(通过一些线程和阻塞实现以确保它完全交换)。
最近我意识到,这是不行的,因为send
无法报告表明远程尚未接收到的信息错误(如举。here)。
我也了解到,TCP连接可以在短暂的网络中断后继续存在,因为内核会缓冲数据包,直到连接在超时时间后宣布死亡(引用。 here)。
的问题是:它是一个可行的策略,以刚刚杀青的超时时间(使用setsockopt
和SO_KEEPALIVE
选项)包括客户端/服务器端waaaay更高,从而使连接“永不超时”?我不得不处理与内核缓冲区填充相关的错误,但这应该相对简单。
是否还有其他失败的案例?
好吧,只是为了确认 - 如果我'sent'一些字节和节点之间的网络下楼在发送的任何点/接收周期,只要这两个节点不明确断开,字节将被接收正确的时候网络恢复了吗? – hnefatl
只要'send()'不会给你一个错误代码,是的。如果你得到一个错误代码(不是100%确定这个atm),你需要迭代(有耐心,没有无尽的循环锤击)尝试再次发送它,但是你*不需要*重新连接套接字 - 只要另一只手不会明确关闭连接。 – hek2mgl