2013-03-22 37 views
1

我有以下curl代码,它向网站发出请求并从中检索数据,它运行良好,但我想将我的数据存储在字符串中而不是输出窗口中。任何想法?把CURL结果放入一个字符串而不是STDOUT?

#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; 
} 
+0

看一看“CURLOPT_WRITEDATA”的描述,还有这个例子:https://curl.haxx.se/libcurl/c/getinmemory.html – moooeeeep 2016-02-16 14:37:59

回答

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; 
} 

,并添加以下卷曲选择你的主要

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; 
+0

@Aoues Guesmi不要忘记释放'msg_in',当它在你的程序中变得无用时 'free(msg_in); msg_in = NULL;' – MOHAMED 2013-03-22 14:15:18

+0

是的,它的工作表示感谢:) 虽然免费已经完成;) – TheForbidden 2013-03-22 14:26:58

+0

好,欢迎 – MOHAMED 2013-03-22 14:27:46

0

尝试这种情况:

curl_easy_setopt(curl, CURLOPT_RETURNTRANSFER, true); 
+1

他没有找到宏CURLOPT_RETURNTRANSFER。它在哪里?是不是在curl/curl.h中? – TheForbidden 2013-03-22 13:53:45

+1

这不是在PHP中卷曲,它是独立卷曲 – KevinDTimm 2013-03-22 14:08:15

1

甲一般(非卷曲特异性)的方法,改变你的标准输出(路径1)(或标准误差:路径2)路径(S)之前的调用curl。请阅读dup2上的手册页,了解如何复制到特定描述符的路径,并使用fdopen函数从中获取FILE *

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

相关问题