2013-03-22 2 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

ответ

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

EDIT

не забудьте освободить msg_in когда он становится безуспешным в вашей программе

free(msg_in); msg_in = NULL; 
+0

@Aoues Guesmi не забудьте освободить 'msg_in', когда он станет бесполезным в вашей программе ' free (msg_in); msg_in = NULL; ' – MOHAMED

+0

да, это сработало спасибо :) бесплатно уже сделано;) – TheForbidden

+0

добро пожаловать, пожалуйста, добро пожаловать – MOHAMED

0

Попробуйте это:

curl_easy_setopt(curl, CURLOPT_RETURNTRANSFER, true); 
+1

он не нашел CURLOPT_RETURNTRANSFER макросъемки. Где это? разве это не в curl/curl.h? – TheForbidden

+1

Это не завиток в php, это автономный завиток – KevinDTimm

1

А в общем (не локон конкретные) метод, изменить свой стандартный вывод (путь 1) (или стандартная ошибка: путь 2) путь (ы) до вызывающий завиток. Прочтите справочную страницу по адресу dup2, чтобы узнать, как дублировать путь к определенному дескриптору, и функцию fdopen, чтобы получить из нее FILE *.

Идея заключается в том, что вы первый dup путь 1 для stdout и/или 2 для stderr, чтобы сохранить их копии где-то. Вы тогда close оригинальные пути. Вы создаете трубу (man pipe), а затем dup2 второй канал трубы к пути 1 (или 2). Теперь вы можете сделать read() с первого канала трубы, чтобы получить вывод, который был там размещен.

Смежные вопросы