2015-02-03 9 views
0

내가 웹에서 특정 파일을 다운로드하는 간단한 HTTP 클라이언트를 만드는거야, 난 내가 데이터를 읽고 있어요 문제가있어, 여기 내 루프입니다 개체,이 괜찮아요, 메서드 canRead 사용할 수있는 데이터가 있는지 테스트 할 select() 사용할 수 있습니다, 나는 프로그램이 너무 빨리 때로는 canRead가 새로운 데이터 수입 및 false를 반환하기 전에 호출되는 데이터를 읽을 것 같아요, 그래서 나는 모두를 읽지 않습니다. 응답, 내가 무슨 말인지 증명하려면이 코드를 사용 :독서 HTTP 응답

AGAIN: 
    do{ 
     client.readString(aux, 256); 
     req.append(aux); 
    }while((test = client.canRead())); 

    if(!test){ 
     std::cout << "false\n"; 
     std::cout << req << std::endl << std::endl; 
     system("pause>null"); 
     goto AGAIN; 
    } 

그래서 w 암탉 다시 내가 다시 갈, 읽을 수있는 더 많은 데이터가 있습니다, canRead 메서드가 잘 작동하는 것을 알고, 문제는 내가 데이터를 읽는 것을 멈출 때를 알지 못한다는 것과이 메서드의 의존은 분명히 권장되지 않는다는 것입니다. 이 문제를 해결하려면 코드에 지연 (수면)을 두거나 소켓 파일에서 직접 데이터를 처리하는 두 가지 솔루션 만 보아라.하지만 더 나은 솔루션을 찾기 위해 여기에왔다.이 작업을 수행하는 공식 방법이있다. ? 아무도 도와 주실 수 없다면, 고맙습니다.

+2

http 헤더에서 읽어야하는 데이터의 양을 파악해야합니다. 그것이 유일한 방법입니다. – Mat

+0

"canRead 메소드가 잘 작동하는 것을 알고 있습니다"- 그렇지 않다고 확신합니다. 귀하의 설명에서 그것의 비 차단처럼 들리지만, 귀하의 애플 리케이션 로직이 올바르지 않습니다. –

+0

이 루프에서'선택 '을 모두 가져와야합니다. HTTP 사양을 읽습니다. 어쨌든 – davmac

답변

0

데이터를 엿볼 수있는 방법을 사용하여 문제가 해결되면 응답 헤더의 끝을 나타내는 '\ r \ n \ r \ n'이 처음 발견 될 때까지 데이터를 엿보고 다음까지 크기를 얻습니다. '\ r \ n \ r \ n'그리고이 데이터 양을 소켓에서 읽으십시오. 그래서 헤더를 처리합니다 : content-length 또는 transfer-encoding이 있는지 확인하십시오. 하나는 내 프로그램이 필요합니다) 회원과 응답 신체를 "디코딩"특정 방법을 호출합니다.

do{ 
     //if the header never ends.... 
     if(req.size() > MAX_HEADER_SIZE) 
      throw std::runtime_error("Invalid HTTP header."); 

     req = peekAvailable(client); 
    }while((header_end = req.find("\r\n\r\n")) == std::string::npos); 

    client.readString(req, header_end + 4); 
    //... Here comes the part to interpret the header information... 

그리고 peekAvailable 방법은 다음과 같습니다 : 그래서 코드는

std::string peekAvailable(TCPClient& client){ 
    uint32 available_data; 
    std::string data; 

    while((available_data = client.getAvailableData()) == 0){ 
     //Here implement a timeout counter.... 
     Sleep(1); 
    } 

    client.peekString(data, available_data); 

    return data; 
    } 

덕분에 모든 관심을.