2009-09-21 73 views
0

我有下載開始時可用的內容長度。所以我知道我需要多少字節請求。 我以1024字節的塊形式下載。在最後的塊中,我請求剩餘的字節數。我正在使用閱讀功能。 但最後一塊需要很多時間才能到達。這是正常的嗎?爲什麼HTTP下載的最後一塊很慢?

+1

如果您的瀏覽器和telnet處理得當,但您的客戶端沒有,那麼爲什麼不發佈相關的代碼片段。 – Duck 2009-09-21 13:52:50

回答

0

謝謝 我想出了問題。我的代碼使用應用程序級緩衝區,因此最後一個塊需要很長時間才能下載。 我一直在使用布賴恩特的書中給出的健壯的io函數。我曾經研究過那些代碼,並忘記了它。我修改了代碼,發現代碼使用了緩衝。

bryant's book - rio functions

,我用被HTTP/1.1製造另一個錯誤。 HTTP 1.0會導致服務器在傳輸數據後關閉連接。 這樣就解決了這個問題。

+2

您可以在HTTP/1.1中使用請求頭'Keep-Alive:close' – Piskvor 2009-11-09 10:00:02

3

也許你最後的塊不夠大,無法刷新緩衝區。

您可以檢查如何刷新fd並在發送最後一個塊後手動執行。

+0

我不明白你的觀點。 – 2009-09-21 13:18:54

+0

當您發送1024個字節時,它看起來足以讓文件描述符內部緩衝區自行刷新。如果內容大小很小,fd將等待超時,然後刷新,或者關閉它。 – 2009-09-21 13:22:44

+0

我要求的字節數爲最後一個塊所需的字節數,而不是1024. – 2009-09-21 13:24:50

2

不,我的猜測是服務器缺少對flush()的調用,所以輸出在某個緩衝區中掛起,直到超時(然後服務器將刷新)。

+0

但我的網頁瀏覽器也應該花時間下載頁面。事實並非如此。瀏覽器立即加載頁面。而我的程序大約需要8秒鐘,大部分時間都在等待最後一塊。 – 2009-09-21 13:23:02

+0

瀏覽器將根據迄今發送的內容開始動作。例如在PHP中,在寫出網頁的「頭部」後調用'flush'是一個好主意,這樣瀏覽器就可以開始加載'head'的內容,而頁面的其餘部分正在寫入/加載。瀏覽器也會嘗試在網頁上獲得標記時立即解析/呈現頁面。這很可能就是爲什麼你在瀏覽器中看到即時渲染的原因。 – geowa4 2009-09-21 13:28:56

+0

好吧忘了瀏覽器。我看到與telnet相同的行爲。 – 2009-09-21 13:33:33