2016-07-23 4 views
1

winsock2를 사용하여 웹에서 파일 바이트를 다운로드하고 있습니다. 지금까지 좋은. 필자는 필요하지 않은 http 헤더를 포함하여 내 바이트를 다운로드하고 내 파일 바이트 코드에 문제를 일으키는 문제가 있습니다.C++ Winsock 파일 다운로드 HTTP 헤더 잘림

예 : 나는 헤더가 "\ 연구 \ n \ 연구 \ 없음"을 찾아 종료되는 위치를 찾을 수 있습니다 알고 Example

. 어쨌든 나는 적어도 그것을 잘라 찾을 수 없거나 ...

int iResponseBytes = 0; 
ofstream ofDownloadedFile; 
ofDownloadedFile.open(pathonclient, ios::binary); 
do { 
    iResponseBytes = recv(this->Socket, responseBuffer, pageBufferSize, 0); 
    if (iResponseBytes > 0)  // if bytes received 
    { 
     ofDownloadedFile.write(responseBuffer, pageBufferSize); 
    } 
    else if (iResponseBytes == 0) //Done 
    { 
     break; 
    } 
    else //fail 
    { 
     cout << "Error while downloading" << endl; 
     break; 
    } 
} while (iResponseBytes > 0); 

:(내가 strncmp 등을 사용하여 배열/포인터를 검색하는 시도 는 희망 누군가가 나에게 도움이 될 수 있습니다.

최저 인사

답변

0

당신은 \r\n\r\n 시퀀스는 하나의 recv() 호출 내에서 완벽하게 수신 할 것, 무엇이든지, 보장이 없습니다. 예를 들어

, 첫 recv() 호출은 시퀀스의 처음 두 문자 (\r\n)가 끝날 때까지 코드를 다시 읽습니다. 두 번째로 recv()이 호출되면 수신 된 처음 두 바이트에 대한 나머지 \r\n이 수신됩니다 (그 뒤에 실제 내용의 첫 번째 부분). 이는 일어날 수있는 작은 가능성이지만 무시할 수 없으며 올바르게 처리해야합니다.

목표가 \r\n\r\n까지 모든 것을 다듬는 것이라면 현재의 접근 방식이 제대로 작동하지 않을 것입니다.

대신 파일 스트림 버퍼링이 실제로 작동하는 방식을 연구하면서 시간을 투자해야합니다. Pontificate, 잠시 동안, std::istream/std::ostream 한 번에 많은 데이터 덩어리를 읽고 쓸 수 있지만 문자 중심 인터페이스를 제공합니다. 예를 들어, std::istream은 한 번에 버퍼의 파일 데이터 전체를 읽은 다음 내부 버퍼에 저장합니다. 그러면 내부 버퍼가 코드에서 한 번에 한 문자 씩 검색 할 수 있습니다. 어떻게 작동합니까? 그것에 대해 생각 해봐.

올바르게 처리하려면 동일한 알고리즘을 직접 구현해야합니다. 즉, recv() 소켓에서 버퍼를 한 번에 가져온 다음 바이트 중심 인터페이스를 제공하여 수신 된 내용을 한 번에 1 바이트 씩 반환합니다.

그런 다음, 주요 코드는 몇 가지가 아닌 명백한 개는에 여전히 있기는하지만 코드가 (\r\n\r\n 사소한하게 볼 때까지하는 모든 것을 버리고 점, 한 번에 스트리밍 소켓 내용을 한 바이트를 읽고, 간단한 루프가된다 이 권리를하고 있지만 새로운 질문이 될 수 있습니다).

물론, \r\n\r\n이 처리되면, 내부적으로 버퍼링 된 내용을 출력 파일에 플러시 한 다음 소켓에서 전체 버퍼를 읽는 작업을 다시 시작하여 확실히 앞으로 나아갈 수 있습니다. byte-oriented 인터페이스를 다루는 CPU 사이클을 굽지 않고 출력 파일에 복사합니다.