2011-09-30 53 views
4

我已經寫了一個C程序,它向網絡服務器發送一個HTTP 1.1 POST請求。
對Wireshark進行監控,服務器響應並獲取HTTP/1.1 200 OK消息的時間少於一秒,但是接着需要20秒才能獲取FIN, ACK數據包,我相信這是導致recv返回0的原因,指定沒有更多的數據。
導致我的程序掛起20秒,它等待服務器發送FIN, ACK數據包。HTTP 1.1與HTTP 1.0相比,延遲了20秒

我已經用HTTP 1.0測試過了,並且沒有延遲。所以我認爲這是因爲默認情況下HTTP 1.1認爲所有連接都是persistent connections
但我的網絡瀏覽器使用HTTP 1.1並沒有任何延遲,所以我認爲我沒有做正確的事情。

我有一個想法是,而不是等待recv返回0,我要檢查,如果我在文件末尾一些其他的方式,但我想不出任何辦法做到這一點。

所以如果有人能向我解釋我應該怎麼做?提前致謝。

+0

我想我們需要看到一些代碼...你打開和維修套接字如何?安迪襪子的選擇? – nhed

回答

6

HTTP 1.1默認爲保持活動連接,而1.0不啓用。您可以通過添加標頭來請求非保持活動

Connection: close 

指示服務器在完成後立即關閉連接。

+0

這可以修復延遲,但是如果我想利用保持活動連接的話會怎麼樣。如何在停止調用'recv'之前知道我是否收到了所有的數據? – Josh

+4

您現在要麼是由於Content-Length標題,要麼是通過對分塊編碼信息進行解碼。 – johannes

+0

總之,正確處理HTTP 1.1要複雜得多。 – morningstar