我整个上午都在调试我的自定义下载器,我终于知道哪里出了问题,但我不知道为什么。
让我解释一下:我正在编写一个 HTTP 下载程序,只使用基本的 winsock 函数,而不是使用任何花哨的类或框架。我不介意它是否阻塞,因为它已经在一个单独的线程中运行,所以实际上我只是使用 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 在返回 0 之前返回 -1。当我调用 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 连接来说是正常的,它们只是不时地断开连接吗?我做错了什么吗?
最佳答案
我打赌你不会从 recv 中得到 10060。您是从连接函数获取它的,问题可能出在指定主机地址上。
关于c++ - 使用 winsock 的奇怪连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7242715/