2011-08-30 148 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次。有些服务器不会像预期的那样响应,如果您无法接收数据,您认为连接也应该丢失。但是也许有些数据包在迷雾和紧密连接数据包中迷失了,至少这是我的猜测。 –