跨平台,具有异步功能的C/C++ HTTP库

Ric*_*ich 23 c c++ asynchronous cross-platform http

我正在寻找一个可以在Windows和Linux上运行的C/C++库,它允许我以不同的方式查询多个web服务器(每分钟1000个)页面标题和下载网页,就像WinHttp库在Windows环境中一样.

到目前为止,我遇到了libCurl,它似乎做了我想要的,但是异步方面看起来很可疑.

您认为绕过使用库的想法并根据可实现此目的的套接字从头开始编写简单的东西是多么容易?

任何意见,建议或建议都会受到欢迎.

附录: - 任何机构都有关于使用libCurl进行此操作的评论,我说同步方面可能看起来很可疑,但有没有人有任何经验呢?

sam*_*ias 34

尝试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;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行:

% 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
Run Code Online (Sandbox Code Playgroud)