2011-08-30 161 views
1

我一直堅持調試我的自定義下載程序整個上午現在我終於知道它出錯了,但我不知道爲什麼。奇怪的連接超時使用winsock

讓我解釋一下:我使用基本的winsock函數編寫HTTP下載程序,而不使用任何花哨的類或框架。我不介意它阻止,因爲它是在一個單獨的線程已經運行所以實際上我只使用MSDN上的示例代碼:

http://msdn.microsoft.com/en-us/library/ms737591(v=VS.85).aspx

發送請求:

GET /index.html HTTP/1.0\r\n 
Host: www.example.com\r\n 
User-Agent: MyCustomDownloader/1.0\r\n 
\r\n 
\r\n 

而且在接收循環我做一些分配,解析標題行,打開文件句柄等。所以它不能一次接收所有內容,需要一些時間。但我想這不應該是個問題吧?我收到4096字節的塊。

一切都很好,但有時的recv返回-1返回0。而當我打電話WSAGetLastError()返回10060指示前:

WSAETIMEDOUT 

Connection timed out. 
A connection attempt failed because the connected party did not properly 
respond after a period of time, or the established connection failed 
because the connected host has failed to respond. 

首先,我認爲這是東道主,但我觀察行爲與任何主機...

這是正常的HTTP連接,他們只是不時退出?難道我做錯了什麼?

+0

您可能想要將修改發佈到示例代碼。 –

+0

在** recv **中阻塞的連接套接字不應該返回WSAETIMEDOUT,如果沒有數據,它只會永遠等待(除非您自己配置一些奇特的超時)。所以我敢說你做錯了什麼,但是我們需要看一些代碼。 – rodrigo

+0

感謝您的回覆,很高興聽到recv不應該返回WSAETIMEDOUT。我沒有設置任何襪子選項,所以超時是默認設置(很長)。是的,我應該發佈一些代碼,但現在它全部散佈在我自己的課堂上。我認爲我應該在本週的某個時候逐一分解我的代碼,但我討厭這樣做。 –

回答

0

我敢打賭你沒有從recv獲得10060。您從連接功能獲得它,問題可能在於指定主機地址。

+0

謝謝!我會看看,實際上我只是在錯誤的'recv'之後調用了'WSAGetLastError' ...我現在解決它的方式是關閉連接並再次發送HTTP請求,最多重試3次。有些服務器不會像預期的那樣響應,如果您無法接收數據,您認爲連接也應該丟失。但是也許有些數據包在迷霧和緊密連接數據包中迷失了,至少這是我的猜測。 –