2016-07-18 2 views
1

C++のlibcurlが奇妙な記号に与えられたURLを変更していることに気付きました。ここでは、コードです: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でそれを構築する場合、この問題が発生しました。このコードで "http://subdomain.mydomain.com/folder/check.php"にアクセスしようとすると動作しますが、キーを追加するとすぐにlibcurlがURL全体を変更します。

ありがとうございます。

+1

'addon_key'とは何ですか?そのタイプは何ですか?あなたは、ライブラリがC++オブジェクト( 'std :: string'など)について何も知らないC関数を持つCライブラリであることを知っていますか? –

+0

これはstd :: string型です。 – Alex

+0

あなたの文字列のように見えますが、ヌルターミネーターがありません – deW1

答えて

3

私のコメントで言ったように、CURLライブラリはC関数のライブラリであり、C関数はC++のオブジェクトやクラスについて何も知らない。

"http://subdomain.mydomain.com/folder/check.php?key=" + addon_keyを実行すると、結果は(一時的な)std::stringオブジェクトになります。それをC関数に渡すとうまく動作せず、コンパイラが実際にあなたが不平を言ってその引数を渡すことに驚いています。私が思うにコンパイラのエラーであったはずです。少なくとも、あなたに厳しい警告を与えるべきです。

あなたは、文字列オブジェクトを格納するために別の変数を作成することによってこの問題を解決し、Cスタイルの文字列(定数charへのポインタ)を取得するために使用c_strメンバ関数ことができます。

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++オブジェクトを期待しない関数に渡すと、は未定義の動作です。

+1

'curl_easy_setopt()'の3番目のパラメータは可変なので、コンパイラ*は入力を検証できません。そのため、 'std :: string'を' char * 'が必要なところで渡すときにコードをコンパイルすることができます。 libcurl 7.17.0から、 'curl_easy_setopt()'は 'char *'入力をコピーします([documentation](https://curl.haxx.se/libcurl/c/curl_easy_setopt.html) 'std :: string'変数が必要な場合は、一時的に' c_str() 'を直接呼び出すことができます。例えば' curl_easy_setopt(curl_handle、CURLOPT_URL、( "http://subdomain.mydomain.com/folder/check.php ?key = "+ addon_key).c_str());'変数を使用する方が安全です –

関連する問題