Wieloplatformowa, biblioteka HTTP C/C++ z funkcją asynchroniczną

Szukam biblioteki C / C++, która będzie działać na Windows i Linux, który pozwoli mi asychronously zapytanie wielu serwerów (1000 na minutę) dla nagłówków stron i pobrać strony internetowe w podobny sposób WinHttp biblioteka robi w środowisku windows.

Do tej pory natknąłem się na libCurl, który wydaje się robić to, co chcę, ale aspekcie asychronous wygląda podejrzane.

Jak łatwo byłoby ominąć pomysł korzystania z biblioteki i napisać coś prostego z scratch na podstawie gniazd, które mogłyby to osiągnąć?

Wszelkie uwagi, porady lub sugestie będą bardzo mile widziane.

Dodatek: - jakieś ciało ma uwagi na temat robienia tego z libcurlem, powiedziałem, że asproniczny aspekt może wyglądać podejrzanie, ale czy ktoś ma z tego jakieś doświadczenie?

Author: Rich, 2011-03-08

2 answers

Spróbuj libevent procedury HTTP. Tworzysz połączenie HTTP i dostarczasz wywołanie zwrotne, które jest wywoływane po nadejściu odpowiedzi (lub wywołaniu zdarzenia timeout).

Aktualizacja : zbudowałem rozproszone połączenie HTTP-Dławienie proxy i używane zarówno th e części klienta i serwera w ramach tego samego demona, wszystkie w jednym wątku. Informatyka świetnie.

Jeśli piszesz klienta HTTP, libevent powinien być odpowiedni. Jedyny ograniczenie, na które natknąłem się po stronie serwera było brak opcji konfiguracyjnych -- API jest trochę rzadkie, jeśli chcesz zacząć dodawać bardziej zaawansowane funkcje; czego się spodziewałem, ponieważ nigdy nie było przeznaczone do zastąpienia serwerów internetowych ogólnego przeznaczenia, takich jak Apache, Nginx. Na przykład poprawiłem go, aby dodać niestandardowy podprogram, aby ograniczyć Całkowity rozmiar przychodzące żądanie HTTP(np. zamknięcie połączenia po odczycie 10MB). Kod jest bardzo dobrze napisany i łatka była łatwa do zaimplementowania.

Używałem 1.3.oddział x; 2.oddział x ma kilka poważny występ ulepszenia w starszych wydaniach.

Przykład kodu: znalazłem kilka minut i napisałem szybki przykład. To powinno cię zapoznać ze stylem programowania 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;
}

Skompiluj i uruchom:

% 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
 33
Author: samplebias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 23:53:35

Cpprestsdk to wieloplatformowa biblioteka http, która umożliwia komunikację z serwerami http. Tutaj jest przykładowy kod na msdn. To używa boost asio na Linuksie i WinHttp na windows

 1
Author: tcb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-06 05:37:00