我注意到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。
提前致谢。
答案 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 ++对象传递给不期望它的函数是未定义的行为。