이제 URL 목록을 얻었으므로 모든 웹 페이지를 다시 가져오고 싶습니다. 나는 많은 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
, 예를 들어 : 여기에 내가 한 일이다 나는 각 호스트에 단지 connect
한 번만,
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/
너무 궁금 수 있으며, 각 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
이 필요합니까?
관대 한 도움에 감사드립니다.
당신은 헤더'연결 사용 할를 통해 지시하지 않는 한 연결의 재사용을 기 대해서는 안 오래된 HTTP1.0 경우 : 계속-Alive'은? 모든 웹 서버가이를 존중할 수있는 것은 아니기 때문에 현재 닫혀있을 때 새로운 연결을 열 준비가되어 있어야합니다. –