1

我有以下 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;
}

并在您的 main 添加以下 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)路径。阅读手册页dup2以了解如何将路径复制到特定描述符,以及fdopen从中获取的函数FILE *

这个想法是您首先dup为 stdout 路径 1,和/或为 stderr 路径 2,将它们的副本保存在某处。然后你close原来的路径。您创建一个管道 ( man pipe),然后创建管道dup2的第二个通道到路径 1(或 2)。您现在可以read()从管道的第一个通道获取放置在那里的输出。

于 2013-03-22T13:53:39.807 回答
0

试试这个:

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