2014-06-13 4 views
1

나는 응답을 조각으로 반환하는 C++의 curl로 서버 요청을 수행하고 있으며 그 조각의 크기도 다를 수 있습니다.CURL 실행 완료 및 시간 초과

각 조각이 도착할 때 콜백 함수가 호출되고 있습니다. 문제는 부모 클래스에 다른 콜백을 수행하기 위해 연결이 완료되면 감지 할 수 없다는 것입니다.

그런데 컬링 타임 아웃을 설정하고 감지 할 수 있는지 알고 싶습니다.

여기에 짧은 내 코드입니다 :

CURL *curl = curl_easy_init(); 
curl_global_init(CURL_GLOBAL_ALL); 

curl_easy_setopt(curl, CURLOPT_URL, "My URL"); 
curl_easy_setopt(curl, CURLOPT_POST, 1); 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "My Postfields"); 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); 

curl_easy_perform(curl); 
curl_easy_cleanup(curl); 
curl_global_cleanup(); 

기본 콜백 :

size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up) 
{ 
    //do something 
    //But how can I detect the last callback when connection finished 
    //in order to call an another one? 
    return size*nmemb; 
} 
+0

음. 어때요? * curl_easy_perform이 반환 된 후에 데이터를 저장하고 후속 작업을 수행하는 방법은? – WhozCraig

+0

@WhozCraig : 죄송합니다. 나는 이전의 코멘트를 삭제했다. 당신이 나를 올바른 방향으로 이끄는 것 같아요! –

답변

2

당신이 콜백 동안 떨어져 저장할 수 있습니다 원하는 데이터, 다음 번 curl_easy_perform 반환을 사용했다. 예 :

size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up) 
{ 
    std::string* pstr = static_cast<std::string*>(up); 
    std::copy(buf, buf+size*nmemb, std::back_inserter(*pstr)); 
    return size*nmemb; 
} 

또는 그 라인을 따라 뭔가 :

CURL *curl = curl_easy_init(); 
curl_global_init(CURL_GLOBAL_ALL); 

// NOTE: added to accumulate data. 
std::string result; 

curl_easy_setopt(curl, CURLOPT_URL, "My URL"); 
curl_easy_setopt(curl, CURLOPT_POST, 1); 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "My Postfields"); 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result); // NOTE: added 
curl_easy_perform(curl); 

// TODO: do something with your data stored in result 

curl_easy_cleanup(curl); 
curl_global_cleanup(); 

그리고 당신의 쓰기 콜백에서

. 나는 모든 오류 검사를 남겨두고 (오타를해서 유감스럽게 생각한다.이 검사를 즉시 사용할 수있는 컴파일러가 없다.)

타임 아웃 길이와 관련하여 쉬운 모드 컬 요청에 사용할 수있는 많은 시간 초과 옵션이 있습니다. 사실 여기에 언급 할 부분이 너무 많습니다. curl_easy_setopt에 대한 설명서를 참조하십시오. 특히 페이지 아래쪽의 약 2/3의 연결 옵션을 참조하십시오.

행운을 빈다.

+0

정말 고마워요! 그것은 문제를 해결합니다. 여기 키가 CURLOPT_WRITEDATA인데, 나는 그것을 잘 이해하지 못했습니다. –

+1

@NhonNguyen 그것의 일반적인 포인터는 컬 (curl)이 옵션으로 (분명히) 당신을 데려 갈 것이고 쓰기 콜백을 호출하는 동안 당신에게 끈적 거리는 소리로 전달할 것이다. 우리는 로컬'std :: string' 객체의 주소를 사용했습니다. 그런 다음 우리는 역 참조를하고 방금받은 모든 데이터를 추가합니다. 컬링 작업이 완료되면 우리가받은 모든 데이터가 문자열로 반환됩니다. – WhozCraig

+0

나는 그것을 이해하지 못해서 붙어있는 CURLOPT_WRITEDATA를 의미했다. 그러나 당신이 내게 모범을 보였을 때 나는 그것을 잘 얻었습니다! 명확히 해 주셔서 다시 한 번 감사드립니다. 너 정말 친절 하구나 :) –