在标准的 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/