4

私は最近CURLについてもっと学びたいと思っていましたが、ついにテストプロジェクトの静的ライブラリとしてCURLを適切にコンパイルしてインストールすることができました。最終的には、フォームの投稿などについて学習します。

からページコンテンツを接続して印刷することに成功しましたhttp://www.google.se

安全なhttpページhttps://www.google.seに接続すると、ページコンテンツとして空の文字列が表示されます。

オプションに関する情報を取得するためにこれを使用しています。

私はこの答えから物事を試しましたが、うまくいかなかったか、間違っていました。
また、verifypeerとverifyhostをオフにしてみましたが(本当に安全なソリューションを実践したいのですが)、どちらも機能しませんでした。

それを機能させるために何をする必要がありますか?私は何か間違ったことをしていますか?


これがテストコードです

#include <iostream>
#include <string>
#include <curl/curl.h>

using namespace std;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
    ((string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main(){
  CURL *curl;
  CURLcode res;
  string readBuffer;

  curl = curl_easy_init();
  if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
    //curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE);

    //Doesn't seem to work
    curl_easy_setopt(curl, CURLOPT_CAINFO, "path\\cacert.pem");

    //Neither does this
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    cout<<readBuffer<<endl;

    system("pause");
  }
  return 0;
}

アップデート

だから私はcurlからエラーメッセージを受け取りました、Unsupported protocolそれはSSLが機能しないときにそれが言うことだと私は推測しています。そのため、SSLを使用して再コンパイルする必要がありました(これは、初めて行ったと思ったので奇妙です)が...

もうすぐあきらめます。はぁ。なんらかの理由で NMAKE: fatal error U1077 nasmw、SSLを作成するときにエラーが発生しましたが、nasmに正しい%PATH%を明確に指定しました。私は手紙の手順に従った。

そこで、 libcurlタイプのcurlバイナリを使用してみましたが、ライブラリファイルに慣れていないため、VC++で正しくリンクする方法がわかりません。

テストプロジェクトをコンパイルしようとすると、これらのリンカーエラーが発生し続けます。

1>main.obj : error LNK2019: unresolved external symbol _curl_easy_cleanup referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_strerror referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_perform referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_setopt referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_init referenced in function _main

とてもイライラしました...なぜそれがそれほど複雑でなければならないのか理解できたらいいのにと思います。
もうライブラリを使いたい!


アップデート2

OK ... SSLを使用してcurlライブラリをコンパイルでき、レポートCURL_VERSION_SSLが有効になっています

curl_version_info_data * vinfo = curl_version_info(CURLVERSION_NOW);

if(vinfo->features & CURL_VERSION_SSL){
    cout<<"CURL: SSL enabled"<<endl;
}else{
    cout<<"CURL: SSL not enabled"<<endl;
}

//Prints out "CURL: SSL enabled"

しかし、それでも同じエラーメッセージが表示されますUnsupported protocol。何が間違っているのかわかりません。

4

2 に答える 2

2

了解しました。ライブラリをn回コンパイルした後、デバッグするまですべてが正常に見え、ヒープエラーが発生しました。これは、もう一度*単収縮*を間違えたことを示しています。

新しいコンパイルセッションを開始する前に、curl.haxxをもう一度調べて、MSVCパッケージを見つけました。私はそれらの扱い方を知っているので、それは私を喜ばせました!静的ライブラリを選択したのは、それが私が望んでいたことだからです。

すべてがスムーズに進んだわけではありませんが、正しく機能させるには、リンカーの依存関係をいくつか追加する必要がありました。

つまり

#pragma comment(lib, "curllib_static.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "openldap.lib")
#pragma comment(lib, "libeay32.lib")

それらを入れて、ダウンロードした他のパッケージの証明書バンドルを使用して、HTTPSに接続できるようにしました。

curl_easy_setopt(curl, CURLOPT_CAINFO, "_path_\ca-bundle.crt");

しかし、私はいくつかの警告を受け取っています。これまでに見たことのない警告です。それらは何も混乱させませんが、それはPDBファイル「vc90」と関係があります。これはVC++が単独で処理すると思っていたものです。

最終的に適切なCURLライブラリをhttps://www.google.se取得した後、(プロジェクトプロパティの下のリンカー依存関係でプラグマが削除および追加された)に接続するコードは次のとおりです。

これがMSVCパッケージ(SSL対応)です。このパッケージのスクリプト(perlまたはVBscript)のいずれかを使用して、証明書バンドルを作成できます。

また、私のような静的ライブラリを使用している場合は、プリプロセッサ定義を追加する必要がありますCURL_STATICLIB

#include <iostream>
#include <string>
#include <curl/curl.h>

using namespace std;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
    ((string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main(){
  CURL *curl;
  CURLcode res;
  string readBuffer;

  curl = curl_easy_init();
  if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
    curl_easy_setopt(curl, CURLOPT_CAINFO, "C:\\libcurl_static\\ca-bundle.crt");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    cout<<readBuffer<<endl;

    system("pause");
  }
  return 0;
}

本当に私のせいでした、私は彼らが持っているダウンロードウィザードの説明をチェックするべきでした。アーカイブ(7.27.0)から最新のソースをダウンロードしたのは、必要なものを取得するために自分でコンパイルする必要があると思ったためです

このすべてが恥ずかしいです。しかし、私はそれから多くを学びました。

于 2012-10-04T22:17:52.777 に答える
1

-vを使用して、完全な応答を調べます。おそらくリダイレ​​クトです。また、Googleはcurlのデフォルトのユーザーエージェントで行われたリクエストをブロックすることで知られています...

于 2012-10-02T22:00:42.447 に答える