如何在继续之前明确等待TCP ACK?

有没有办法让send()等待所有已发送的数据已被确认(如果已达到ACK的超时,则返回-1),或者是否有其他机制等待在send()之后但在做其他事情之前确认?

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

我知道我可以实现一个应用层ACK,但是当TCP的ACK很好地完成目的时,我宁愿不这样做。

遗憾的是,标准API没有保留任何适当的方法来执行此操作。 可能有一种方法可以查询当前的TCP发送窗口大小/用法,但不幸的是,标准方法可能无法查询。

当然,有一些棘手的方法可以达到你想要的效果。 例如,在Windows上,可以创建网络filter驱动程序来监视数据包级别的流量。

AFAIK没有办法。

此外,它不可靠,ACK仅表示内核接收到数据,同时客户端或其计算机可能已崩溃。 您会认为客户端收到了数据,但实际上它从未处理过。

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

这适用于我的Linux 3.8内核,我相信它在其他地方有用。

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