更新:问题不在libcurl中。取消请求的正确方法是如果从回调非零值返回。我使用了curl_progress_callback函数,并且一切正常。libCurl。同时取消请求
0
A
回答
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++的函数。您需要调用换到WriteResponce
在extern "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
。
相关问题
- 1. 示例如何取消libcurl的请求
- 2. ”请求被中止:请求被取消。“同时处理PayPal IPN
- 3. libcurl以json格式获取请求
- 4. 并行libcurl HTTP请求
- 5. C++ LibCurl发送HTTPS请求
- 6. 如何取消同步WinHttp请求?
- 7. 取消URL请求
- 8. ASIHTTPRequest请求取消
- 9. 取消ASIHTTP请求
- 10. 取消getUserMedia请求
- 11. 取消XHR请求
- 12. AFHTTPRequestOperation取消请求
- 13. 取消FB.api(...)请求
- 14. 取消HTTP请求
- 15. 当新请求来自同一用户时,如何取消先前的请求
- 16. 请求被中止:请求被取消
- 17. 铬:GET请求取消CORS HTTPS请求
- 18. Tomcat请求通过超时取消
- 19. Windows何时取消机上WDF请求?
- 20. 取消libcurl简单句柄
- 21. 改装取消请求
- 22. 取消重复请求NSURLConnection
- 23. 在Tomcat中取消请求
- 24. 自动取消jqgrid请求
- 25. $ http.jsonp请求是gettings取消
- 26. Three20:取消网络请求
- 27. 铬取消角2请求
- 28. 凌空取消请求
- 29. iOS Swift - NSURLConnection.sendAsynchronousRequest取消请求
- 30. 电子webview取消请求
所示的代码很好。问题在别处。显示所有的代码。 –
@ n.m。但是当我编写ProgressShow时总是返回0,一切正常无误! – Alecs
如果您拥有的是触发器的图片,则无法使用枪诊断问题。 –