2011-11-16 43 views
1

我正在編寫一個瀏覽器,它發送http獲取請求的方式與瀏覽器所做的相同。我想測試的「保持活動」頭,所以我發送和接收以下封裝兩次:HTTP套接字保持活着不起作用

 
"POST /test.php HTTP1.1\r\n" 
"Host: 192.168.0.1:8000\r\n" 
"Connection: keep-alive\r\n" 
"Content-Length: 17\r\n" 
"Content-Type: application/x-www-form-urlencoded\r\n" 
"Accept-Language: en-US,en;q=0.8\r\n" 
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n" 
"User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2\r\n" 
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" 
"Referer: http://192.168.0.1:8000/test.php\r\n" 
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n" 
"\r\n\r\n" 
"para:test_tst_tst" 

然而,當我收到的第二次,我得到錯誤10054(Windows錯誤)。似乎服務器拒絕向我發送數據。

這是什麼問題?

+3

您是否檢查過來自服務器的響應,其標頭是否也有保持活動狀態?另外請記住,服務器上的超時時間可能只有幾秒鐘。 –

+0

您在「HTTP/1.1」請求的第一行中缺少「/」。你的內容之前還有一個額外的「\ r \ n」 - 你有兩個空白行而不是一個。因此,你身體的實際內容長度是19,而不是17;那麼服務器可能會嘗試解析下一個請求,就好像它以「st」開始一樣,這是第一個請求結束時的額外兩個字符。 –

+0

你有什麼嘗試?服務器似乎在您的本地網絡上,所以您應該能夠檢查其日誌。你有沒有看到任何錯誤?第一個請求的迴應是什麼?像Fiddler這樣的工具對你的請求有什麼看法,它們是否有效(根據其他評論者的看法,它不是那麼有效)?服務器是否配置爲永不履行keepalive(因爲它可能會忽略標題並使用'Connection:close'來響應並且這樣做)? – CodeCaster

回答

1

我猜你正在談論的錯誤10054是Winsock error "Connection reset by peer"

你的問題是,你有HTTP頭和身體之間的3\r\n雙,而不是僅僅2

"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n" 
"\r\n\r\n" 
"para:test_tst_tst" 

the spec報價:

generic-message = start-line 
        *(message-header CRLF) 
        CRLF 
        [ message-body ] 

那麼服務器會讀小學三\r\n對作爲主體的前2個字節,然後保留在Content-Length標題中指定的17個字節的主體長度。因此,而不是從POST開始,您的第二個請求將被解釋爲以stPOST開頭,這可能會令服務器感到困惑。

刪除一對\r\n對,你應該沒問題。

Btw,Keep-Alive是HTTP 1.1中Connection-Type的默認值,因此您甚至不需要明確指定。