2011-11-23 56 views
3

我需要知道什麼時候Windows套接字的發送緩衝區是空的,也就是說,它在什麼時候被放到線路上。 SIO_FLUSH似乎什麼都不做,只能殺死這個緩衝區的內容,而不是等到TCP完成發送。如何找出Windows套接字發送緩衝區是否爲空?

我需要它的原因是因爲我不能在單獨的連接上開始發送數據,直到手邊的連接上的數據全部發送(或最接近該數據)爲止。

這可能看起來像一個非常奇怪的要求,像惡意協議一樣反彈,但協議是HTTP,這已經通過它的步伐:)。我需要將大量數據實時推送到瀏覽器,並且網絡滯後時間阻止了我在數據進入時請求更多數據,因爲這會使請求基於滯後而不僅僅是帶寬變慢。理想的解決方案將是一個無限的請求,接收1實時數據流,但如前所述,我必須使用HTTP不支持這一點。我無法控制客戶端的HTTP實現(嚴格的請求響應)。因此,爲了優化帶寬使用並儘可能接近實時數據,我需要知道連接1上的緩衝區何時發送,然後才能發送連接2的數據(實時生成數據並應該不要陳舊)。

如果有人有任何想法如何做到這一點,請讓我知道。

回答

2

在Windows中,無法查詢發送緩衝區的狀態。

如果發件人使用阻塞套接字,只要發送緩衝區有空間,那麼套接字將保持接收更多數據,然後當緩衝區填滿套接字將阻塞發送代碼,直到緩衝區釋放一些空間。

如果發件人使用非阻塞套接字,套接字將在緩衝區填滿時報告WSAEWOULDBLOCK錯誤,然後稍後的FD_WRITE通知會告知發件人何時發送緩衝區釋放了某個空間。

無論採用哪種方式,套接字都會通知您發生了什麼,您不必查詢它。

根據響應數據的性質,您可以在HTTP中使用HTTP 1.1 Transfer-Encoding: chunked功能或各種server pushing技術,以瞭解您描述的情況類型。您的HTTP客戶端是否支持其中的任何一個都是另外一回事。

+0

客戶端是任何瀏覽器。我需要以極高的帶寬利用率向瀏覽器發送高度敏感的數據。 xmlHttpRequest將如何分割塊?值得期待!在任何情況下,我發現http://support.microsoft.com/kb/214397其中描述了將sendbuffer大小設置爲0,這可能會做我所需要的,除非我可能需要等待TCP ACK從瀏覽器(浪費帶寬,因爲我可以發送下一批)。 – DDS

+0

xmlHttpRequest在單獨的連接上運行,只需發送一個命令並接收任何其他正常HTTP操作的響應。您無法直接檢測或捕獲TCP ACK,WinSock會在內部處理它們,然後根據需要解除阻塞的「send()」或發送「FD_WRITE」通知。就我個人而言,我甚至不會盡力扼制帶寬,只需儘可能多地發送儘可能多的數據,並注意套接字何時可以接受並且無法接受更多數據。這就是你需要做的。 –

+0

我等待ACK的原因是因爲沒有發送緩衝區,操作系統沒有其他方式掛起數據直到它被阻止,而不是阻止我的發送。如果數據包丟失,需要重新發送數據包,因此操作系統需要在此之前存儲數據。除了允許應用程序繼續,它不得不阻止它直到確認。 爲了我的目的,我需要將答覆按順序送達客戶端,這意味着我不能只在需要時回答。此外,請求A應該儘可能快地發送,我不希望B干擾它(因爲它們會共享帶寬) – DDS