2012-04-21 2 views
1

이제 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이 필요합니까?

관대 한 도움에 감사드립니다.

+1

당신은 헤더'연결 사용 할를 통해 지시하지 않는 한 연결의 재사용을 기 대해서는 안 오래된 HTTP1.0 경우 : 계속-Alive'은? 모든 웹 서버가이를 존중할 수있는 것은 아니기 때문에 현재 닫혀있을 때 새로운 연결을 열 준비가되어 있어야합니다. –

답변

2

HTTP 1.1 연결은 지속적입니다. 다음 요청 - 응답 시퀀스가 ​​이미 설정된 TCP 연결을 재사용 할 수있는 POST/GET-200 OK 시퀀스.
하지만 필수 사항은 아닙니다. 연결은 언제든지 닫을 수 있으므로이를 코드화해야합니다.

또한 자신의 HTTP 클라이언트를 구현하려고합니다.
왜 그렇게하고 싶은지 모르겠지만, 어쨌든 HTTP 헤더에 대해 이해해야 만 기본 TCP 연결이 가능한 한 오랫동안 열려 있는지 확인할 수 있습니다.

물론

서버가 명시 적으로 연결 유지 헤더

+0

"연결 유지"를 "연결 유지"로 설정했지만 아무 효과가없는 것 같습니다. 그것은 단지 운동이며, 나는 약간의 개선을하고 싶다. – Flybywind

+0

wireshark를 사용하여 통신 흐름을 확인하십시오. 어떻게 든 연결을 닫을 수 있습니까? – Cratylus

관련 문제