2016-10-09 2 views
1

libcurl과 약간 이상한 문제가 있습니다. 기본적으로 HTTP 서버에서 파일을 다운로드하는 동안 파일 끝에 가비지 바이트가 출력됩니다. 파일 이 1,710,017 바이트가되어야하지만 라이브러리는 대신 1,712,128 개 (2,111 개)를 씁니다. 후자의 숫자가 2^12 (및 2^13이지만 다른 경우에는 2^12의 배수를 따르는)이기 때문에 버퍼링 문제라고 생각합니다. 여분의 데이터는 파일의 다른 부분에서 읽은 각 바이트 수 (한 번에 4 개의 주소 중 하나에서 끝까지 읽는 것만 보입니다) 또는 한 경우에는 CD이 2,111 번 반복됩니다.파일을 다운로드 할 때 libcurl이 여분의 후행 바이트를 출력합니다.

관련 코드 :

std::string url; // defined elsewhere 
FILE* data; // initialized elsewhere with option "wb" 
CURL* query = curl_easy_init(); 

curl_easy_setopt(query, CURLOPT_WRITEDATA, data); 
curl_easy_setopt(query, CURLOPT_URL, url); 
curl_easy_setopt(query, CURLOPT_FOLLOWLOCATION, true); 
curl_easy_setopt(query, CURLOPT_SSL_VERIFYPEER, false); 

CURLcode res = curl_easy_perform(query); 

또한 : 간단한 기록 콜백을 사용하는 경우와 동일한 문제가 발생하여, 문제가 주어진 원격 서버뿐만 아니라 특정 하나를 발생한다.

편집 # 1 : 동일한 Windows 파일 (동일한 라이브러리 파일이있는 두 대의 컴퓨터에서 테스트 됨)에서만 Windows 용으로 복제 할 수 있습니다. 데비안에서 작동합니다.

편집 # 2 :libcurl이 내 랩톱에 내장 된 경우에도 발생합니다. 추가 컨텍스트를 제공하기 위해 Windows 10에서 VC14 환경을 사용하는 Marc Hörsken의 ZIP (공식 컬 다운로드 페이지에서 사용 가능)을 구축하고 있습니다.

+0

이 https://curl.haxx.se/libcurl/c/getinmemory.html을 보셨습니까? – PnotNP

+0

@ NulledPointer 관련성이 보이지 않습니까? 또한 OP에 대한 마지막 편집을 확인하십시오. – caseif

+0

코드에 문제가없는 것 같아요. 특정 컴퓨터에서 컴파일 할 때만 발생하기 때문에, 그 컴퓨터가 libcurl의 버그가있는 버전을 사용하고 있다고 말하고 싶습니다. –

답변

0

나는 이상한 VC 버그 또는 다른 비정상적인 동작에이 사실을 알리고 있습니다. FILE 대신 fstream을 사용하도록 문제 코드를 다시 작성하면 트릭이 완료됩니다.

관련 문제