gpt4 book ai didi

c++ - 跨平台,具有异步能力的 C/C++ HTTP 库

转载 作者:IT老高 更新时间:2023-10-28 21:34:19 29 4
gpt4 key购买 nike

我正在寻找一个可以在 Windows 和 Linux 上运行的 C/C++ 库,它允许我异步查询多个网络服务器(每分钟 1000 个)以获取页眉并以与 WinHttp 库相同的方式下载网页windows 环境。

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

您认为绕过使用库的想法并基于可以实现此目的的套接字从头开始编写一些简单的东西有多容易?

非常欢迎任何意见、建议或建议。

附录:- 任何人都对使用 libCurl 进行此操作有意见,我说异步方面可能看起来很可疑,但有人对此有任何经验吗?

最佳答案

试试 libevent HTTP 例程。您创建一个 HTTP 连接并提供一个回调,当响应到达(或超时事件触发)时调用该回调。

更新:我构建了一个分布式 HTTP 连接限制代理并使用了两者e 客户端和服务器部分在同一个守护进程中,都在一个线程上。它效果很好。

如果您正在编写 HTTP 客户端,那么 libevent 应该是一个不错的选择。唯一的我在服务器端遇到的限制是缺少配置选项——如果您想开始添加更多高级功能,API 有点稀疏;这是我所预料的,因为它从未打算取代像 Apache、Nginx 这样的通用 Web 服务器。例如,我对其进行了修补以添加一个自定义子例程来限制入站 HTTP 请求(例如,读取 10MB 后关闭连接)。代码写得很好,补丁也很容易实现。

我使用的是 1.3.x 分支; 2.x 分支有一些 serious performanceimprovements超过旧版本。

代码示例:找了几分钟,写了一个简单的例子。这应该让您熟悉 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

关于c++ - 跨平台,具有异步能力的 C/C++ HTTP 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5237963/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com