2013-03-22 38 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()以獲取放置在那裏的輸出。

相關問題