Кроссплатформенная, C / C ++ HTTP библиотека с асинхронной возможностью - PullRequest
23 голосов
/ 08 марта 2011

Я ищу библиотеку C / C ++, которая будет работать в Windows и Linux, которая позволит мне асинхронно запрашивать у нескольких веб-серверов (1000 в минуту) заголовки страниц и загружать веб-страницы почти так же, как библиотека WinHttp всреда Windows.

До сих пор я сталкивался с libCurl, который, кажется, делает то, что я хочу, но асинхронный аспект выглядит подозрительным.

Как вы думаете, насколько легко было бы обойти эту идею?использования библиотеки и написать что-то простое с нуля, основываясь на сокетах, которые могут этого достичь?

Любые комментарии, советы или предложения будут очень приветствоваться.

Приложение: - У любого органа есть комментарии по поводу выполненияэто с libCurl, я сказал, что асинхронный аспект может выглядеть подозрительно, но кто-нибудь имеет опыт этого?

Ответы [ 2 ]

34 голосов
/ 08 марта 2011

Попробуйте libevent Подпрограммы HTTP.Вы создаете HTTP-соединение и предоставляете обратный вызов, который вызывается при получении ответа (или срабатывает событие тайм-аута).

Обновлено : я создал распределенный прокси-сервер регулирования HTTP-соединения и использовал обаКлиентские и серверные части внутри одного и того же демона, все в одном потоке.Это отлично работает.

Если вы пишете HTTP-клиент, libevent должен хорошо подойти.Единственное ограничение, с которым я столкнулся на стороне сервера, было отсутствие параметров конфигурации - API немного редок, если вы хотите начать добавлять более продвинутые функции;что я ожидал, так как он никогда не был предназначен для замены веб-серверов общего назначения, таких как Apache, Nginx.Например, я пропатчил его, чтобы добавить пользовательскую подпрограмму, чтобы ограничить общий размер входящего HTTP-запроса (например, закрыть соединение после чтения 10 МБ).Код очень хорошо написан, и патч легко реализовать.

Я использовал ветку 1.3.x;ветка 2.x имеет серьезных улучшений производительности по сравнению со старыми выпусками.

Пример кода: Нашел несколько минут и написал быстрый пример.Это должно познакомить вас со свободным стилем программирования:

#include <stdio.h>
#include <event.h>
#include <evhttp.h>

void
_reqhandler(struct evhttp_request *req, void *state)
{
    printf("in _reqhandler. state == %s\n", (char *) state);
    if (req == NULL) {
        printf("timed out!\n");
    } else if (req->response_code == 0) {
        printf("connection refused!\n");
    } else if (req->response_code != 200) {
        printf("error: %u %s\n", req->response_code, req->response_code_line);
    } else {
        printf("success: %u %s\n", req->response_code, req->response_code_line);
    }
    event_loopexit(NULL);
}

int
main(int argc, char *argv[])
{
    const char *state = "misc. state you can pass as argument to your handler";
    const char *addr = "127.0.0.1";
    unsigned int port = 80;
    struct evhttp_connection *conn;
    struct evhttp_request *req;

    printf("initializing libevent subsystem..\n");
    event_init();

    conn = evhttp_connection_new(addr, port);
    evhttp_connection_set_timeout(conn, 5);
    req = evhttp_request_new(_reqhandler, (void *)state);
    evhttp_add_header(req->output_headers, "Host", addr);
    evhttp_add_header(req->output_headers, "Content-Length", "0");
    evhttp_make_request(conn, req, EVHTTP_REQ_GET, "/");

    printf("starting event loop..\n");
    event_dispatch();

    return 0;
}

Скомпилируйте и запустите:

% gcc -o foo foo.c -levent
% ./foo    
initializing libevent subsystem..
starting event loop..
in _reqhandler. state == misc. state you can pass as argument to your handler
success: 200 OK
1 голос
/ 06 декабря 2015

Microsoft cpprestsdk - это межплатформенная библиотека http, которая обеспечивает связь с серверами http. Здесь - это некоторый пример кода в msdn.Это использует Boost Asio на Linux и WinHttp на Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...