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