2011-09-13 68 views
0

更新:问题不在libcurl中。取消请求的正确方法是如果从回调非零值返回。我使用了curl_progress_callback函数,并且一切正常。libCurl。同时取消请求

+0

所示的代码很好。问题在别处。显示所有的代码。 –

+0

@ n.m。但是当我编写ProgressShow时总是返回0,一切正常无误! – Alecs

+0

如果您拥有的是触发器的图片,则无法使用枪诊断问题。 –

回答

0

你需要了解的是CURL是一个C库。一般来说,你不能传递指向C++对象或函数的指针,因为C不知道关于C++类和调用约定的任何信息。

例如,这条线是不正确的:

curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); 

CURL SETOPT CURLOPT_ERRORBUFFER预计,第三个参数是一个指向具有用于CURL_ERROR_SIZE字符空间C风格串(C-风格char数组)。而是将指针传递给std::string对象。由于用C语言编写的CURL不知道std::string是什么,它只是用错误数据覆盖具有sizeof (std::string)字节的字节表示,因为它认为指针是C风格的char数组。

使用这个代替:

char errorBuffer[CURL_ERROR_SIZE + 1]; errorBuffer[CURL_ERROR_SIZE] = '\0'; 
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); 

errorBuffer只充满如果curl_easy_perform()返回错误代码有效的字符串。

此外,Uploader::WriteResponce是一个C++函数。使用此行:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteResponce); 

CURL期望第三个参数是指向C函数。在这里,你正在传递一个指向C++的函数。您需要调用换到WriteResponceextern "C"函数调用C++函数:

extern "C" size_t call_uploader_writeresponce(char *ptr, size_t size, size_t nmemb, void *user_data) { 
    return Uploader::WriteResponce(ptr, size, nmemb, static_cast<std::string *>(user_data)); 
} 


// ... 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &call_uploader_writeresponce); 

“写功能”需要返回size_t,不int; Uploader::WriteResponce需要返回size_t

+0

但所有的工作正常。我只在ProgressShow返回非零值时才写程序崩溃。我做了你所说的 - 同样的事情 – Alecs

+0

@Alecs:它可能工作,但它绝对不会一直工作,因为它调用未定义的行为。请使用新代码更新您的问题,该代码包含我提到的问题的修补程序。 –

+0

我已经尝试过没有课,而且仍然是同样的事情。问题已更新 – Alecs