現在我已經有了一個url列表,我想要返回所有的網頁。這裏是我做了什麼:我可以保持與http服務器連接嗎?
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
只有一次,每個主機和那麼每個網址只需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
需要某種reset
每個recv()?
謝謝你的慷慨幫助。
你使用的標題'連接明確地表示:保持Alive'?不是所有的網絡服務器都可以遵守它,所以你應該準備在電流關閉時打開一個新的連接。 – 2012-04-21 08:09:54