我很好奇为什么备选#1功能正常而备选#2在执行CURLE_OPT_MALFORMAT
curl_easy_perform(m_curl);
备选方案#1
curl_easy_reset(m_curl);
char sUrl[8192];
/* In Alternative #1, m_strUrl is a C++ std::wstring member variable */
wcstombs(sUrl, m_sUrl.c_str(), m_sUrl.length());
sUrl[m_sUrl.length()] = '\0';
CURLcode code = curl_easy_setopt(m_curl, CURLOPT_URL, sUrl);
CURLcode perform = curl_easy_perform(m_curl);
备选方案#2
curl_global_init(CURL_GLOBAL_ALL);
/* init the curl session */
m_curl_handle = curl_easy_init();
/* set URL to get here*/
/* In Alternative #2, m_strUrl is a C++ std::string member variable */
CURLcode retval = curl_easy_setopt(m_curl_handle, CURLOPT_URL, (char
*)m_sUrl.c_str());
CURLcode perform = curl_easy_perform(m_curl);
我阅读了以下网址
How to convert a std::string to const char* or char*?
如果您只想将std::string
传递给需要const char*
的功能,可以使用
std::string str;
const char * c = str.c_str();
如果您想获得可写副本,例如char *
,您可以这样做:
std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0
// don't forget to free the string after finished using it
delete[] writable;
编辑:请注意,上述内容并非异常安全。如果新调用和删除调用之间的任何内容抛出,您将泄漏内存,因为没有任何内容会自动调用delete。有两种方法可以解决这个问题。
我想知道为什么替代#2会在我做的时候窒息:
CURLcode retval = curl_easy_setopt(m_curl_handle, CURLOPT_URL, (char*)m_sUrl.c_str());
是否有必要使用
创建可写副本,例如(char*
)
std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0
当我在Windows线程函数中使用时: curl_easy_setopt(m_curl_handle,CURLOPT_URL,(char *)m_sUrl.c_str()); 其次是: CURLcode retval = curl_easy_perform(m_curl);
Windows线程函数在之后的早期终止: CURLcode retval = curl_easy_perform(m_curl) 这样我就无法读取与之相关的CURLcode curl_easy_perform(m_curl)。
非常感谢任何帮助
答案 0 :(得分:0)
我刚刚在AXIS P1347网络摄像机上测试了这个C ++代码,它运行正常。
std::vector<char> writable(m_sUrl.size());
strcpy(&writable[0], m_sUrl.c_str());
CURLcode retval = curl_easy_setopt(m_curl_handle, CURLOPT_URL, &writable[0]);
CURLcode perform = curl_easy_perform(m_curl_handle);
答案 1 :(得分:0)
使用选项CURLOPT_URL传递给curl_easy_setopt的URL参数的空终止非常重要。同样重要的是要认识到,如果URL在libcurl静态函数parseurandfillconn(..)中正确解析,curl_easy_perform会阻塞,直到请求的传输回调完成或超时。请参考uRL Is curl_easy_perform() synchronous or asynchronous? 详情。如果libcurl静态函数parseurandfillconn(..)检测到格式错误的URL,curl_easy_perform会立即返回而不会阻塞。