2012-03-07 64 views
0

我在連接插座上使用我的服務器這樣的事情將數據發送到客戶端時:NoBufferSpaceAvailable將數據發送到插座

IAsyncResult asyncRes = connectionSocket.BeginSend(data, 0, length, SocketFlags.None, 
    out error, new AsyncCallback(SendDataDone), signalWhenDataSent); 

,因爲它似乎,當有服務器之間的互聯網連接速度較慢客戶端我收到這樣的異常描述:NoBufferSpaceAvailable

這個錯誤究竟意味着什麼?套接字connectionSocket的內部OS緩衝區已滿?有什麼辦法使它工作。作爲出現在http代理服務器中的上下文。這可能表明,我想,數據來自源服務器的速率高於我的服務器可以使用代理客戶端處理的速率。你將如何處理它?

我正在使用tcp。

+0

你使用什麼協議? TCP? – svick 2012-03-07 13:52:45

回答

0

解決此問題的方法是將一個套接字從一個套接字讀取到另一個套接字的速度相關聯,因爲如果不進行緩衝,則無法以比連接的客戶端更高的速度寫入套接字最終可以閱讀。

您使用同步套接字問題不會出現,因爲它們會阻止,只要操作仍在等待,但異步調用不是這種情況。

-1

確切地說,持有傳出數據的內核套接字緩衝區很可能已滿。你對客戶發送的速度太快了。您可以嘗試增加發送緩衝區大小,但這並不能保證您不會再遇到此問題。

簡單的答案是,您應該準備好發送操作可能會失敗,並在稍後重試。在應用程序中維護不斷增長的緩衝區並不理想,但如果您停止接收,原始服務器也應該放慢速度(取決於TCP窗口大小和接收緩衝區大小)。

+0

通過TCP發送操作不會以您在此處描述的方式失敗。如果套接字發送緩衝區已滿,則send()將僅阻止在最低級別,而異步回調則不會被調用。他正在耗盡其他一些緩衝空間,例如異步的東西。這可能仍然是他正在運行 – EJP 2012-03-07 22:54:18

+0

@EJP你的評論可能被切斷了.. – Ghita 2012-03-08 09:12:42

+0

@EJP實際上,如果你使用非阻塞操作,它們可能會因ENOBUFS而失敗。不過,我確實錯過了他使用異步的東西。這並沒有改變應用程序試圖發送得太快的事實,這可以通過例如固定的方式來解決。減緩了原始服務器的接收速度。 – ldx 2012-03-08 12:12:28