有没有一种方法可以让send()等待,直到已发送的所有数据都已被ACK-ED(或者如果已达到ACK的超时,则返回-1),或者在进行其他操作之前等待ACK的某些其他机制?
我正在使用标准的Unix Berkeley套接字API。
我知道我可以实现应用程序层ACK,但当TCP的ACK完全满足目的时,我宁愿不这样做。
我正在使用标准的Unix Berkeley套接字API。
我知道我可以实现应用程序层ACK,但当TCP的ACK完全满足目的时,我宁愿不这样做。
据我所知,目前没有任何方法。
并且,这样做也不可靠,ACK仅意味着内核已接收到数据,在此期间,客户端或其计算机可能已经崩溃。虽然您会认为客户端已经接收了数据,但实际上它从未处理过该数据。
很遗憾,标准API没有任何适当的方法来实现此功能。虽然可能有一种方法可以查询当前TCP发送窗口大小/使用情况,但不幸的是它可能无法通过标准方式查询。
当然,有一些巧妙的方法可以达到你想要的效果。例如,在Windows上可以创建网络过滤驱动程序来监视数据包级别的流量。
我似乎已经找到了一个解决方案。至少在Linux上,如果你将SO_SNDBUF设置为0,它似乎会在允许下一次传输之前等待每个事务。虽然它会立即返回,但是在前一个发送完成之前,它不会继续允许另一个发送成功。我还没有尝试使用select(...)来确定数据是否已发送。
这在我的Linux 3.8内核上可以工作,并且我有信心它也可以在其他地方工作。