2016-06-20 4 views
1

libcurl을 사용하여 원격 Http 서버에 파일을 청크 업로드하려고합니다. 아래 함수를 호출하여 READDATA 및 READFUNCTION을 설정하여 콜백 매개 변수를 등록합니다. 그러나 curl_easy_perform() 중에 libcurl이 여전히 충돌합니다. 아무도 그것에 도움을 줄 수 있습니까? 내가 전화 무엇 감사파일을 업로드하기 위해 READDATA 및 READFUNCTION을 설정하면 libcurl이 fwrite()에서 충돌합니다.

:

ReadCallbackStatic(void *contents, size_t size, size_t nmemb, void *userp); 
curl_easy_setopt(curl_data.m_lib_curl_handle_ptr, CURLOPT_READFUNCTION, ReadCallbackStatic); 
curl_easy_setopt(curl_data.m_lib_curl_handle_ptr, CURLOPT_READDATA, userdata); 

스택 추적 : 나는 너무 CURLOPT_WRITEDATA 및 CURLOPT_WRITEFUNCTION을 설정해야처럼

(gdb) bt 
#0 0x00007ffff604741a in fwrite() from /lib64/libc.so.6 
#1 0x00007fffec8713f3 in Curl_client_write() from libcurl.so 
#2 0x00007fffec8851b7 in Curl_readwrite() from libcurl.so 
#3 0x00007fffec885ea7 in ??() from libcurl.so 
#4 0x00007fffec886a28 in Curl_perform() from libcurl.so 
#5 0x00007fffec8873c6 in curl_easy_perform() from libcurl.so 
+2

[MCVE] (http://stackoverflow.com/help/mcve)와 실제 스택 추적을 제공하십시오. – paddy

+0

[Jay는 이미 curl 버그에 제기 된 문제에 대해 (https://github.com/curl/curl/issues/886#issuecomment-227044315) 적절히 답변했습니다. 두 곳에서 코드를 보지 못했지만. 이것은 사용자 오류 일 가능성이 큽니다. –

+0

@paddy 스택 추적을 추가했습니다. 감사. –

답변

0

보인다. 충돌은 http POST 응답 데이터를 처리하기 위해 기본적으로 libcurl에서 사용하는 fwrite()에서 발생합니다. CURLOPT_WRITEFUNCTION을 설정하면 충돌이 사라집니다. 응답 데이터가 stdout으로 보내지지 않고 fwrite()로 보내지는 이유는 무엇입니까?

+0

큰 프로젝트에서 일하기 때문에 전체 코드를 여기에 표시하는 것은 어렵습니다. CURLOPT_WRITEFUNCTION과 CURLOPT_WRITEDATA를 모두 설정해야합니다. 그렇지 않으면 스택 추적 아래에서 충돌이 발생합니다. 쓰기 데이터와 함수가 설정되어 있지 않으면 libcurl은 기본적으로 fwrite()를 호출합니다. 내 프로젝트에서 일부 코드는 CURLOPT_WRITEFUNCTION 및 CURLOPT_WRITEDATA의 기본값을 설정 해제 같아요. libcurl의 function()이 위의 두 옵션에 대한 기본값을 설정 해제 할 수 있다는 것을 알고 있습니까? 감사. –