1

Web サイトにリクエストを送信し、そこからデータを取得する次の curl コードがありますが、うまく機能しますが、データを出力ウィンドウではなく文字列に保存したいと考えています。何か案が?

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

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://api.hostip.info/get_html.php?ip=xxx.xxx.xx.xxx");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    res = curl_easy_perform(curl);
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
    curl_easy_cleanup(curl);
  }
  return 0;
}
4

3 に答える 3

2
int http_get_response(void *buffer, size_t size, size_t rxed, char **msg_in)
{
    char *c;

    if (asprintf(&c, "%s%.*s", *msg_in, size * rxed, buffer) == -1) {
        free(*msg_in);
        msg_in = NULL;
        return -1;
    }

    free(*msg_in);
    *msg_in = c;

    return size * rxed;
}

メインに次のcurlオプションを追加します

char *msg_in = calloc(1,sizeof(char));

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_get_response);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &msg_in);

次に、メッセージを取得しますmsg_in

編集

msg_inプログラムで役に立たなくなったら解放することを忘れないでください

free(msg_in); msg_in = NULL;
于 2013-03-22T13:56:25.973 に答える
1

一般的な (curl 固有ではない) メソッドで、curl を呼び出す前に標準出力 (パス 1) (または標準エラー: パス 2) のパスを変更します。man ページを読んでdup2、特定の記述子へのパスを複製する方法と、それfdopenを取得する関数を確認FILE *してください。

アイデアは、最初dupに stdout のパス 1 および/または stderr の 2 をパスして、それらのコピーをどこかに保存することです。その後close、元のパス。パイプ ( man pipe) を作成してから、パイプdup2の 2 番目のチャネルをパス 1 (または 2) に作成します。read()パイプの最初のチャネルから、そこに配置された出力を取得できるようになりました。

于 2013-03-22T13:53:39.807 に答える
0

これを試して:

curl_easy_setopt(curl, CURLOPT_RETURNTRANSFER, true);
于 2013-03-22T13:49:10.990 に答える