Попробуйте libevent Подпрограммы HTTP.Вы создаете HTTP-соединение и предоставляете обратный вызов, который вызывается при получении ответа (или срабатывает событие тайм-аута).
Обновлено : я создал распределенный прокси-сервер регулирования HTTP-соединения и использовал обаКлиентские и серверные части внутри одного и того же демона, все в одном потоке.Это отлично работает.
Если вы пишете HTTP-клиент, libevent должен хорошо подойти.Единственное ограничение, с которым я столкнулся на стороне сервера, было отсутствие параметров конфигурации - API немного редок, если вы хотите начать добавлять более продвинутые функции;что я ожидал, так как он никогда не был предназначен для замены веб-серверов общего назначения, таких как Apache, Nginx.Например, я пропатчил его, чтобы добавить пользовательскую подпрограмму, чтобы ограничить общий размер входящего HTTP-запроса (например, закрыть соединение после чтения 10 МБ).Код очень хорошо написан, и патч легко реализовать.
Я использовал ветку 1.3.x;ветка 2.x имеет серьезных улучшений производительности по сравнению со старыми выпусками.
Пример кода: Нашел несколько минут и написал быстрый пример.Это должно познакомить вас со свободным стилем программирования:
#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