C ++中的libcurl:将URL转换为一些奇怪的符号

时间:2016-07-18 21:14:02

标签: c++ linux c++11 curl libcurl

我注意到c ++的libcurl更改了提供给某些奇怪符号的URL。这是代码:

curl_global_init(CURL_GLOBAL_ALL);

curl_handle = curl_easy_init();
cout << "http://subdomain.mydomain.com/folder/check.php?key=" + key << endl;

curl_easy_setopt(curl_handle, CURLOPT_URL, "http://subdomain.mydomain.com/folder/check.php?key=" + addon_key);

curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);

res = curl_easy_perform(curl_handle);

这就是我在控制台中获得的内容:

http://subdomain.mydomain.com/folder/check.php?key=tasdasm34234k23l423m4234mn23n4jk23bjk4b23nasdasdasdasdsdsd
* Rebuilt URL to: � ��g/
* IDN support not present, can't parse Unicode domains
* getaddrinfo(3) failed for �   ��g:80
* Couldn't resolve host '�  ��g'
* Closing connection 0

当我在Windows中构建项目时,此代码完全正常,但是当我使用Linux构建它时,会发生这种情况。如果我只是尝试访问&#34; http://subdomain.mydomain.com/folder/check.php&#34;使用此代码,它可以工作,但只要我添加密钥,libcurl就会更改整个URL。

提前致谢。

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,CURL库是一个C函数库,C函数对C ++中的对象或类没有任何了解。

执行"http://subdomain.mydomain.com/folder/check.php?key=" + addon_key时,结果是(临时)std::string对象。将它传递给C函数将无法正常工作,我很惊讶编译器实际上允许您在没有抱怨的情况下传递该参数。它应该是我认为的编译器错误,或者至少应该给你一个严厉的警告。

您可以通过创建另一个变量来存储字符串对象来解决这个问题,并使用c_str成员函数来获取C样式字符串(指向常量char的指针):

std::string url = "http://subdomain.mydomain.com/folder/check.php?key=" + addon_key;
curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());

我不知道cURL是否复制了字符串,或者您是否需要保持url变量处于活动状态,直到您完成所有操作。

它显然在Windows上工作只不过是纯粹的运气。将C ++对象传递给不期望它的函数是未定义的行为