我需要知道 Windows 套接字的发送缓冲区何时为空,即它何时被放入线路。 SIO_FLUSH 似乎什么也不做,只是杀死该缓冲区的内容,而不是等到 TCP 完成发送它。
我需要它的原因是因为我不能开始在单独的连接上发送数据,直到手头连接上的数据全部发送(或最接近)。
这似乎是一个非常奇怪的要求,看起来像是糟糕的协议,但该协议是 HTTP,并且已经通过了它的测试:)。我需要将大量数据实时推送到浏览器,而网络延迟时间会阻止我在数据进入时请求更多数据,因为这会导致基于延迟的请求变慢,而不仅仅是带宽。理想的解决方案是接收 1 个实时数据流的无休止的请求,但如上所述,我必须使用不支持此功能的 HTTP。我无法控制客户端的 HTTP 实现(严格来说是请求-响应)。
因此,为了优化带宽使用并尽可能接近实时数据,我需要在发送连接 2 的数据之前知道连接 1 上的缓冲区何时发送(数据是实时生成的,不应过时) 。
如果有人知道如何实现此目的,请告诉我。
在Windows中,没有办法查询发送缓冲区的状态。
如果发送方使用阻塞套接字,只要发送缓冲区有空间,套接字就会继续接受更多数据,然后当缓冲区填满时,套接字将阻塞发送代码,直到缓冲区释放一些空间。
如果发送方使用非阻塞套接字,则套接字将报告WSAEWOULDBLOCK
当缓冲区填满时出错,然后稍后出错FD_WRITE
通知将告诉发送者发送缓冲区何时释放了一些空间。
无论哪种方式,套接字都会通知您发生了什么,您不必查询它。
根据响应数据的性质,HTTP 1.1Transfer-Encoding: chunked
功能,或各种服务器推送 http://en.wikipedia.org/wiki/Server_push技术,可以在 HTTP 中用于您描述的情况类型。您的 HTTP 客户端是否支持其中任何一个是另一回事。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)