1

C++ アプリケーションで Curl (libcurl) を使用していますが、Cookie を送信できません (と思います)。

Fiddler、TamperData、および LiveHTTP ヘッダーがインストールされていますが、これらはブラウザー トラフィックを表示する場合にのみ役立ち、マシン上の一般的なネットワーク トラフィックを監視することはできない (ように思われる) ため、マシンを実行してもヘッダー情報が表示されません。送信されています。しかし、ブラウザーでページを表示すると、正常にログオンすると、Cookie 情報が送信されていることがわかります。

アプリを実行しているときにページに正常にログオンし、その後別のページをフェッチしようとすると、(ページ) データはログオンしていないことを示しています。つまり、「状態」が何らかの形で失われています。

私の C++ コードは問題ないように見えるので、何が問題なのかわかりません。これが、次のことを行う必要がある理由です。

  1. まず、自分のマシンのネットワーク トラフィック (ブラウザ トラフィックだけでなく) を表示できるようにする - どの (無料) ツール?

  2. Curl を間違って使用していると仮定すると、コードのどこが悪いのでしょうか? (Cookie は正常に取得および保存されていますが、何らかの理由でリクエストと共に送信されていないようです。

これは、HTTP リクエストの Cookie 側を処理するクラスのセクションです。

curl_easy_setopt(curl, CURLOPT_TIMEOUT, long(m_timeout));
curl_easy_setopt(curl, CURLOPT_USERAGENT,
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; WOW64; SV1; .NET CLR 2.0.50727)");
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);

上記のコードに何か問題がありますか?

4

2 に答える 2

2

Wireshark (以前のEthereal)を使用して、マシンが送受信しているすべてのネットワークトラフィックを表示できます。

于 2010-02-23T12:48:56.843 に答える
0
  1. Sean Carpenterが言ったように、Wiresharkはネットワークトラフィックを表示するための適切なツールです。キャプチャを開始し、httpHTTPトラフィックのみを表示するためのフィルターとして使用します。Curlによって送受信されたHTTPリクエスト/レスポンスを確認したいだけの場合は、CURL_VERBOSEオプションを設定し、stderr:を確認してくださいcurl_easy_setopt(curl, CURLOPT_VERBOSE, 1L)
  2. Curlを正しく使用していると思います。次の(完全な)例をコンパイルして実行します。2回目に実行すると(cookies.txt存在する場合)、Cookieがサーバーに送信されることがわかります。

コード例:

#include <stdio.h>
#include <curl/curl.h>

int main()
{
    CURL *curl;
    CURLcode success;
    char errbuf[CURL_ERROR_SIZE];
    int m_timeout = 15;

    if ((curl = curl_easy_init()) == NULL) {
        perror("curl_easy_init");
        return 1;
    }

    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    curl_easy_setopt(curl, CURLOPT_TIMEOUT, long(m_timeout));
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/");
    curl_easy_setopt(curl, CURLOPT_USERAGENT,
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; WOW64; SV1; .NET CLR 2.0.50727)");
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);

    if ((success = curl_easy_perform(curl)) != 0) {
        fprintf(stderr, "%s: %s\n", "curl_easy_perform", errbuf);
        return 1;
    }

    curl_easy_cleanup(curl);
    return 0;
}
于 2010-02-23T14:31:24.753 に答える