我在 Linux C 程序中使用 TCP 流套接字来传输数据。我的问题是:丢包会发生什么?
Linux 套接字是否实现了 TCP 数据包恢复机制,以便丢失的数据包在超时后重新发送?
或者我是否必须检查 send()
返回值并在它为零时重新发送数据?
最佳答案
如果您使用的是 TCP 套接字或 unix 域套接字(当您 ls -l
它)。但是在这两种情况中的任何一种情况下,答案都是肯定的,它们实现了数据包恢复(但是在 unix 套接字中不会丢失/恢复多少),不,您不必重新发送数据。
但是您仍然应该检查 send() 是否有错误;连接可能断开,因为有人刚刚拔掉了你的网线,或者你的 send() 可能溢出内部缓冲区,导致部分发送(还有很多其他原因以及发送可能出错的原因)。但是一旦您完成了 send()
,并且它的返回值并不表明它“忘记”了一些数据,您就完成了。
请注意,在您的 send() 完成后和接收方获取您的所有数据之前,连接可能仍会中断。检查这一点的唯一方法是让接收方确认数据,并检查发送方是否收到确认。 (我在这里不是在谈论 TCP ACK)。但是,您的连接可能会在接收方获得所有数据之后以及您获得完整的 ACK 之前中断。如果您真的需要防止这种情况发生,则必须实现一些交易方案,在连接中断后重新连接并询问接收方处理了哪些交易并重新发送其他交易。
关于c - Linux C stream socket中的TCP机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238707/