c - tcp - 收到 num 个字节

标签 c tcp

在标准的 tcp 实现中(例如,在 bsd 上),有人知道是否有可能找出远程主机已确认了多少字节吗?在套接字上调用 write() 返回写入的字节数,但我相信这实际上意味着可以放入 tcp 缓冲区的字节数(不是写入网络的字节数,或确认的字节数)。或者我错了...

谢谢!

最佳答案

当您设置 NODELAY=false(默认设置)时,当您使用比 TCP 窗口更少的字节调用 send() 时,字节不会立即发送,所以您是对的。操作系统会稍等片刻,看您是否调用另一个 send(),以便仅使用一个数据包传输组合数据,避免浪费 TCP header 。

当 NODELAY=true 时,数据在您调用 send() 时传输,因此您可以(理论上)依靠返回值。但由于增加了网络效率低下,因此不推荐这样做。

总而言之,如果不需要绝对精度,即使NODELAY=true,也可以使用send()返回的值。该值不会反射(reflect)即时现实,但几毫秒后它会(但也会检查丢失的连接,因为您发送的最后一个数据 block 可能已经丢失)。一旦连接正常终止,您就可以相信所有数据都已传输。如果不是,您之前就会知道 - 要么是因为连接突然断开,要么是因为您收到了与数据保留相关的错误(或任何其他错误)。

关于c - tcp - 收到 num 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/628149/

相关文章:

c - 在枚举中定义 "Unknown"或 "NULL"值

c - 遍历和比较数组的子集

c# - 反序列化通过 TCP 发送的数据

Windows Socket TCP 客户端每 200 毫秒接收一次数据(QTCPSocket)

Python Paramiko SSH session 在闲置数小时后未激活

c++ - 切换到 MPI_LONG_LONG_INT 会崩溃吗?

c - 在没有库和指针的情况下构建 strcat

c - 如何正确释放某些 malloc 的数组元素?

networking - Windows 7 : Change the priority of traffic to wired instead of the wireless connection?

tcp - 如何在 Julia 中停止 TCP 服务器?