我需要知道Windows套接字的发送缓冲区何时为空,也就是说,它在什么时候被放到线上。 SIO_FLUSH似乎什么都不做,只能杀死这个缓冲区的内容而不是等待TCP发送完毕。
我需要它的原因是因为我必须不开始在单独的连接上发送数据,直到手头连接上的数据全部发送(或最接近该数据)。
这可能看起来像一个非常奇怪的要求,就像糟糕的协议,但协议是HTTP,这已经通过它的步伐:)。我需要实时将大量数据推送到浏览器,并且网络延迟时间阻止我在数据进入时请求更多数据,因为这会使请求变慢,这取决于滞后而不仅仅是带宽。理想的解决方案是接收1个实时数据流的无限请求,但如上所述,我必须使用不支持此功能的HTTP。我无法控制客户端的HTTP实现(严格的请求 - 响应)。
因此,为了优化带宽使用并尽可能接近实时数据,我需要知道在发送连接2的数据之前何时发送连接1上的缓冲区(数据是实时生成的,不应该过时了。
如果有人知道如何做到这一点,请告诉我。
答案 0 :(得分:3)
在Windows中,无法查询发送缓冲区的状态。
如果发送方使用阻塞套接字,只要发送缓冲区有空间,套接字就会继续接受更多数据,然后当缓冲区填满时,套接字将阻塞发送代码,直到缓冲区释放一些空间。 / p>
如果发件人使用非阻塞套接字,则套接字将在缓冲区填满时报告WSAEWOULDBLOCK
错误,然后稍后FD_WRITE
通知将告知发送方何时发送缓冲区已有释放了一些空间。
无论哪种方式,套接字都会告诉您它发生了什么,您不必查询它。
根据您的响应数据的性质,可以在HTTP中使用HTTP 1.1 Transfer-Encoding: chunked
功能或各种server pushing技术来处理您描述的情况类型。您的HTTP客户端是否支持其中任何一个是另一回事。