【问题标题】:TCP mechanism in Linux C stream socketLinux C流套接字中的TCP机制
【发布时间】:2014-01-20 16:06:18
【问题描述】:

我在 Linux C 程序中使用 TCP 流套接字来传输数据。我的问题是:丢包会发生什么?

Linux 套接字是否实现了 TCP 数据包恢复机制,以便丢失的数据包在丢失后在超时后重新发送? 还是我必须检查send() 返回值,如果为零则重新发送数据?

【问题讨论】:

  • TCP 处理它,这基本上就是它的全部目的......所有那些 acks 和 windows 和框架 'n' 垃圾......但你必须检查你的返回值......
  • 想一想-它必须处理丢包-否则API中有一个严重的错误,因为它提供了一个流接口!即使您愿意,API 也没有为您提供足够的信息来重新发送。

标签: c linux sockets tcp


【解决方案1】:

如果您使用的是 TCP 套接字,还是 unix 域套接字(当您 ls -l 它时,它以 's' 作为文件类型出现在文件系统中),您的问题并不清楚。但是在这两种情况中的任何一种情况下,答案都是肯定的,它们实现了数据包恢复(但是在 unix 套接字中丢失/恢复的情况并不多),不,您不必重新发送数据。

但是,您仍然应该检查 send() 是否有错误;连接可能已断开,因为有人刚刚拔掉了您的网络电缆,或者您的 send() 可能会溢出内部缓冲区,从而导致部分发送(还有很多其他原因以及发送可能出错的原因)。但是一旦你完成了send(),并且它的返回值并不表明它“忘记”了一些数据,你就完成了。

请注意,在您的 send() 完成后且在接收方获取您的所有数据之前,连接可能仍会中断。检查的唯一方法是让接收方确认数据,如果收到确认,请检查发送方。 (我在这里不是在谈论 TCP ACK)。但是,您的连接可能会在接收器获取所有数据之后并且在您获得完整的 ACK 之前中断。如果您确实需要防止这种情况发生,则必须实施一些事务方案,在连接中断后重新连接并询问接收方哪些事务已处理并重新发送其他事务。

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多