2013-02-17 4 views
1

나는 학교 프로젝트를위한 http 1.0 웹 프록시를 작성하고있다. 모든 작업을 완료했지만 작동하지만 내 read() 호출이 매우 느립니다. 나는 read() 호출 (C의 stdlib에서 호출) 주위에 타이머를 두었습니다. 나는 0s의 무리가 5-20s가 걸리는 것에 뒤이어 계속 읽는 것을 본다. 이것은 단순한 고속 사이트 (Google, 데비안 등)에 있습니다. 어수선한 사이트에서는 시간이 초과되어 페이지가로드되지 않습니다 (cnn, yahoo 등).프록시 프로젝트에서 느린 소켓 읽기()

요청의 Host: 라인에서 서버 소켓을 열고 프록시 된 브라우저 (이 경우 firefox)에서 정확한 GET 요청을 작성하고 있습니다. 쓰기에는 0이 필요합니다. 다음은 예제 요청입니다 (해시는 시각화 용입니다).

######### 
GET http://debian.org/ HTTP/1.0 
Host: debian.org 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/20100101 Firefox/18.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 


######### 

(끝의 두 \r\n 선 포함.) 내가 잘못 읽고 있습니까? 아니면 잘못된 요청을하는 것입니까? 크롬에 페이지를로드하거나 심지어 텔넷에서 GET 요청을 사용하는 것은 번개처럼 빠르다.

다음은 읽기 작업을 수행하는 코드입니다. 당신이 원하는 서버를 알려줍니다 : "연결 유지 연결"선 "실제 읽기 시간"출력은 일반적으로 무언가 0, 0, ..., 0, 당신은을 사용하고 15

boost::shared_ptr<std::string> SocketBase::read(bool toEof) const 
{ 
    if (!this->isConnected()) 
    { 
    Exceptions::raise<std::runtime_error>(__FILE__, __LINE__, "Socket is not connected."); 
    } 

    boost::shared_ptr<std::string> bytes = boost::shared_ptr<std::string>(new std::string()); 
    while (toEof || bytes->rfind(CRLFCRLF) == std::string::npos) 
    { 
    char buffer[BufferSize]; 
    time_t before = ::time(0); 
    int rc = ::read(this->socket, buffer, BufferSize); 
    time_t after = ::time(0); 
    std::cerr << "Actual read time: " << after - before << "s." << std::endl; 

    if (rc == 0) 
    { 
     break; 
    } 
    else if (rc < 0) 
    { 
     Exceptions::raise<Exceptions::ReadException>(__FILE__, __LINE__, ::strerror(errno)); 
    } 
    else 
    { 
     bytes->append(buffer, buffer + rc); 
    } 
    } 

    return bytes; 
} 
+1

'Content-Length' 헤더가 없습니다. 이 헤더를 보내어 다시 시도 할 수 있습니까? 'Content-Length : 0' ..? – SuperSaiyan

+0

나는 나 자신이 싫어 ... 나는 GET과 Host : 행을 제외한 모든 것을 다 정리했다. cnn.com은 0.5 초 안에로드됩니다. – kwiqsilver

답변

1

같은 동일한 연결에서 둘 이상의 요청이있을 수 있습니다. 서버는 응답을 보내고 추가 요청을 기다리고 있습니다. 연결이 없으면 결국 연결이 닫힙니다. 이것은 아마도 당신이보고있는 행동 일 것입니다. 요청이 처리 된 후 서버가 연결을 닫으려면 "연결 : 닫기"를 통해 요청하십시오. keep-alive 연결 (및 더 높은 성능)을 위해서는 HTTP/1.1을 사용하고 Content-Length 헤더를 사용해야합니다 ...