当我执行curl_easy_setopt(m_curl_handle,CURLOPT_URL,(char *)m_sUrl.c_str())时为什么会发生CURLE_OPT_MALFORMAT?

时间:2015-07-31 06:30:08

标签: c++ string c++11 libcurl

我很好奇为什么备选#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)。

非常感谢任何帮助

2 个答案:

答案 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会立即返回而不会阻塞。