Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Обновлено. Я построил прокси-сервер распределенного HTTP-подключения и использовал оба e клиент и сервер в одном и том же демоне, все в одном потоке. Это отлично работал.

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

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

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

#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

Ответ 2

Microsoft cpprestsdk - это кросс-платформенная http-библиотека, которая позволяет общаться с http-серверами. Здесь приведен пример кода msdn. Это использует boost asio для linux и WinHttp для Windows