现在我有了一个url列表,我想把所有的网页都要回来。以下是我所做的工作:
for each url:
getaddrinfo(hostname, port, &hints, &res); // DNS
// create socket
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
connect(sockfd, res->ai_addr, res->ai_addrlen);
creatGET();
/* for example:
GET / HTTP/1.1\r\n
Host: stackoverflow.cn\r\n
...
*/
writeHead(); // send GET head to host
recv(); // get the webpage content
end我已经注意到许多url都在同一主机下,例如:
http://job.01hr.com/j/f-6164230.html
http://job.01hr.com/j/f-6184336.html
http://www.012yy.com/gangtaiju/32692/
http://www.012yy.com/gangtaiju/35162/所以我想知道,我是否可以只对每个主机执行一次connect操作,然后对每个url只执行creatGET()、writeHead()和recv()操作?这可能会节省很多时间。所以我像这样修改了我的程序:
split url into groups by their host;
for each group:
get hostname in the group;
getaddrinfo(hostname, port, &hints, &res);
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
connect(sockfd, res->ai_addr, res->ai_addrlen);
for each url in the group:
creatGET();
writeHead();
recv();
end
end不幸的是,我发现我的程序只能取回每个组中的第一个网页,其余的都返回空文件。我是不是遗漏了什么?也许sockfd需要为每个recv()提供某种reset?
谢谢你的慷慨帮助。
发布于 2012-04-21 16:16:48
HTTP 1.1连接是持久的,这意味着在POST/GET - 200 OK序列之后,下一个请求-响应序列可以重用已经建立的TCP连接。
但这不是强制性的。连接可能在任何时候关闭,因此您也应该为此编写代码。
另外,在我看来,您似乎正在尝试实现自己的HTTP客户端。
我不知道您为什么要这样做,但不管怎样,如果您必须这样做,您应该阅读一些关于HTTP RFC的内容,以了解各种报头,以确保底层TCP连接尽可能长时间地打开。
当然,如果您的服务器是旧的HTTP1.0,那么除非通过keep-alive标头明确指出,否则不应该期望任何连接的重用
https://stackoverflow.com/questions/10257325
复制相似问题