【问题标题】:putting CURL result in a string and not STDOUT?将 CURL 结果放入字符串而不是 STDOUT?
【发布时间】:2013-03-22 13:46:24
【问题描述】:

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

【问题讨论】:

标签: c http curl stdout io-redirection


【解决方案1】:
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;

【讨论】:

  • @Aoues Guesmi 不要忘记释放msg_in,当它在你的程序中变得无用时free(msg_in); msg_in = NULL;
  • @MohamedKALLEL,因为你的写函数 appends 字符到msg_in 你应该处理初始化情况,即你可以预先分配它char *msg_in = malloc(1); *msg_in = '\0'; 或处理这种情况在写入函数本身内(例如,如果 msg_inNULL,则分配它和 memcpy 来自输入缓冲区的字节)。
  • @deltheil 实际上我忘记在我的答案中添加它。谢谢你的评论。答案已更新
【解决方案2】:

一种通用(非 curl 特定)方法,在调用 curl 之前更改标准输出(路径 1)(或标准错误:路径 2)路径。阅读dup2 上的手册页,了解如何复制特定描述符的路径,以及如何使用fdopen 函数从中获取FILE *

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

【讨论】:

    【解决方案3】:

    试试这个:

    curl_easy_setopt(curl, CURLOPT_RETURNTRANSFER, true);
    

    【讨论】:

    • 他没有找到宏 CURLOPT_RETURNTRANSFER。它在哪里?不是在 curl/curl.h 中吗?
    • 这不是 php 中的 curl,它是独立的 curl
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2012-02-04
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多