2012-11-06 366 views
2

我有一個簡單的自定義HTTP服務器服務客戶端。爲什麼SNDBUF太低會破壞HTTP?

將SNDBUF設置爲512000一切正常。但是,將其設置爲低或將其保留爲默認值(無論如何)會導致Chrome和Firefox無法接收所有響應數據 - Firefox會在大約150000 - 250000字節後截斷它(即使內容保持不變,偏移量也會每次更改相同),並且Chrome提供了一個沒有詳細信息的錯誤。

問題中的特定響應大約爲300000字節,並且全部發送到一個塊中。

Rex Swain's HTTP Viewer這樣的工具,curl和wget報告沒有這樣的問題,並顯示所有的數據。

爲什麼設置SNDBUF會影響Chrome和Firefox接收數據的能力?我理解SNDBUF是如何影響性能的,但我不明白如何將它設置得太低會破壞流。

+2

自定義HTTP服務器...審計所有'write(2)'/'writev( 2)'/'發送(2)'調用來查看它們是否正確處理返回值。這似乎是最可能的問題來源。 –

回答

0

您可以一次寫入底層套接字的數據量受當時可用的發送緩衝區大小的限制。正如Nikolai所說的,您需要檢查send()的返回值或等價值,以確定您在函數中傳遞的所有數據是否已寫入發送緩衝區。如果不是,那麼您需要等待套接字再次變爲'可寫入',然後寫入未完成的數據。

不同的瀏覽器/ HTTP客戶端之間截斷點不同的原因有很多。一個原因可能是接收方(客戶端)接收其套接字的緩衝區大小,因爲大小決定了TCP擁塞窗口大小(用於流量控制),這也影響實際傳輸速度。另一個可能的原因是HTTP Viewer/curl/wget可能只是讀取套接字的速度超過Chrome或Firefox的讀取速度等。