C语言 在继续之前如何显式地等待TCP ACK ?



是否有一种方法可以让send()等待,直到所有已发送的数据已被ACK-ed(或返回-1,如果已达到ACK的超时),或者有一些其他机制在send()之后等待ACK,但在做其他事情之前?

我正在使用标准的Unix Berkeley套接字API。

我知道我可以实现应用层ACK,但是当TCP的ACK服务非常好时,我宁愿不这样做。

没有办法。

同样,它也不可靠,ACK只意味着内核接收到数据,在此期间客户端或其机器可能已经崩溃。您可能认为客户端收到了数据,但实际上它从未处理过数据。

遗憾的是,标准API没有保留任何适当的方法来做到这一点。可以是查询当前TCP发送窗口大小/使用情况的一种方法,但不幸的是,它可能无法通过标准方法查询。

当然,有一些棘手的方法来实现你想要的。例如,在Windows上,可以创建一个网络过滤驱动程序来监视包级流量。

我似乎找到了解决办法。至少在Linux上,如果将SO_SNDBUF设置为0,那么在允许下一个传输通过之前,它似乎等待每个事务。虽然它会立即返回,但在前一个发送发送完成之前,它不会继续允许另一个发送成功。我没有尝试使用select(…)来确定数据是否已发送。

这在我的Linux 3.8内核上工作,我相信它在其他地方也能工作。

您可以为send()编写一个包装器。我在另一个帖子里回答了一个类似的问题。

最新更新