【问题标题】:Why does CURLE_OPT_MALFORMAT occur when I do curl_easy_setopt(m_curl_handle, CURLOPT_URL, (char*)m_sUrl.c_str())?为什么当我执行 curl_easy_setopt(m_curl_handle, CURLOPT_URL, (char*)m_sUrl.c_str()) 时会出现 CURLE_OPT_MALFORMAT?
【发布时间】:2015-10-22 17:40:49
【问题描述】:

我很好奇为什么当我执行curl_easy_perform(m_curl); 时替代#1 功能正常,而替代#2 返回CURLE_OPT_MALFORMAT

备选方案#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;

编辑:请注意,上述内容不是异常安全的。如果在 new 调用和 delete 调用之间抛出任何东西,您将泄漏内存,因为没有任何东西会自动为您调用 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)。

非常感谢任何帮助

【问题讨论】:

  • 问了 76 个问题,但您仍然不知道如何正确格式化它们?
  • @Praetorian,感谢您正确格式化我的问题。你能评论我的问题吗?非常感谢。
  • 您可以使用std::vector<char> writable(size); 代替char *writable = new char[size];。这应该是异常安全的。
  • @rodrigo,感谢您的评论。我有一个问题问你。首先,我们如何将 std::vector 转换为 CURLcode 所需的 char* 指针 code = curl_easy_setopt(m_curl, CURLOPT_URL, sUrl);非常感谢。
  • @Frank:简单,使用writable.data() 成员函数。它返回一个char *。或者,您可以使用&writable[0],因为向量的内存是连续的。

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


【解决方案1】:

我刚刚在 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);

【讨论】:

    【解决方案2】:

    使用选项 CURLOPT_URL 传递给 curl_easy_setopt 的 URL 参数的空终止很重要。同样重要的是要认识到,如果 URL 在 libcurl 静态函数 parseurandfillconn(..) 中正确解析,curl_easy_perform 会阻塞,直到请求的传输回调完成或超时。请参考网址 Is curl_easy_perform() synchronous or asynchronous? 详情。如果 libcurl 静态函数 parseurandfillconn(..) 检测到格式错误的 URL,curl_easy_perform 会立即返回而不阻塞。

    【讨论】:

      猜你喜欢
      • 2019-09-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      相关资源
      最近更新 更多