web-dev-qa-db-ja.com

クロスプラットフォーム、非同期機能を備えたC / C ++ HTTPライブラリ

WindowsおよびLinuxで動作するC/C++ライブラリを探しています。これにより、複数のWebサーバー(1分あたり1000)にページヘッダーを非同期的にクエリし、Windows環境でWinHttpライブラリを実行するのとほぼ同じ方法でWebページをダウンロードできます。 。

これまでのところ、libCurlに出くわしました。これは私が望むことを実行しているように見えますが、非同期の側面は疑わしいようです。

ライブラリを使用するという考えを回避し、これを実現できるソケットに基づいて最初から簡単なものを書くのはどれほど簡単だと思いますか?

コメント、アドバイス、提案は大歓迎です。

補遺:-libCurlでこれを行うことについてコメントがある人はいますか?非同期の側面は疑わしいように見えるかもしれませんが、誰かがそれを経験したことがありますか?

23
Rich

libevent HTTPルーチンを試してください。 HTTP接続を作成し、応答が到着したとき(またはタイムアウトイベントが発生したとき)に呼び出されるコールバックを提供します。

更新:分散HTTP接続スロットリングプロキシを構築し、同じデーモン内でクライアントとサーバーの両方の部分をすべて単一のスレッドで使用しました。それはうまくいきました。

HTTPクライアントを作成している場合は、libeventが適しているはずです。サーバー側で遭遇した唯一の制限は、構成オプションの欠如でした。より高度な機能の追加を開始したい場合、APIは少しまばらです。これは、ApacheやNginxなどの汎用Webサーバーを置き換えることを意図したものではなかったためです。たとえば、インバウンドHTTPリクエストの全体的なサイズを制限するカスタムサブルーチンを追加するようにパッチを適用しました(たとえば、10MBの読み取り後に接続を閉じる)。コードは非常によく書かれており、パッチは簡単に実装できました。

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
34
samplebias

Microsoftの cpprestsdk は、httpサーバーとの通信を可能にするクロスプラットフォームのhttpライブラリです。 ここ はmsdnのサンプルコードです。これは、Linuxではboost asioを使用し、WindowsではWinHttpを使用します

1
tcb