有没有办法让send()等到所有已发送的数据都被确认(或者如果已经达到ACK的超时则返回-1),或者是否有其他机制可以在发送()之后但在做其他事情之前等待ACK?
我正在使用标准的Unix Berkeley套接字API。
我知道我可以实现一个应用层ACK,但是当TCP的ACK很好地完成目的时,我宁愿不这样做。
答案 0 :(得分:5)
AFAIK没有办法。
此外,它不可靠,ACK仅表示内核接收到数据,同时客户端或其计算机可能已崩溃。您会认为客户端收到了数据,但实际上它从未处理过它。
答案 1 :(得分:4)
不幸的是,标准API没有保留任何适当的方法来执行此操作。 可能是查询当前TCP发送窗口大小/用法的一种方法,但不幸的是,标准方法可能无法查询它。
当然,有一些棘手的方法可以达到你想要的效果。例如,在Windows上,可以创建网络过滤器驱动程序来监视数据包级别的流量。
答案 2 :(得分:2)
我似乎找到了解决方案。至少在Linux上,如果将SO_SNDBUF设置为0,则在允许下一次传输之前,它似乎等待每个事务。虽然它会立即返回,但在上一次发送之前,它不会继续允许其他发送成功。我没有尝试使用select(...)来确定数据是否已被发送。
这适用于我的Linux 3.8内核,我相信它可以在其他地方使用。
答案 3 :(得分:0)
您可以为send()编写包装器。我在另一个thread回答了类似的问题。