Пишу HTTP-балансировщик с кэшем в memcached с использованием libevent. Могу создавать сервер и отдавать контент, могу забирать контент, могу кэшировать, а с матчастью плохо. В данном случае создается сервер 0.0.0.0:8080, при поступлении запроса нужно забрать данные с 127.0.0.0:80 и отдать клиенту, т.е. пока что это просто прокси. Есть примерно такой код (некоторые части выкинул):
void request_cb (struct evhttp_request *req, void *arg)
{
if (req->response_code == 200)
{
struct evbuffer* buf3 = evhttp_request_get_input_buffer (req); // Забираем буфер
int len = evbuffer_get_length(buf3);
tmp = malloc(len+1);
memcpy(tmp, evbuffer_pullup(buf3, -1), len);
tmp[len] = '\0';
printf("%s\n", tmp); // Печатаем, то что получили из буфера
free(tmp);
event_loopexit(NULL);
}
}
void list_cb (struct evhttp_request *req, void *arg)
{
/* Здесь описываем подключение к веб-серверу */
struct evhttp_connection *conn;
struct evhttp_request *req1;
event_init();
conn = evhttp_connection_new("127.0.0.1", 80);
req1 = evhttp_request_new(request_cb, NULL); // После скачивания идем в коллбек request_cb
evhttp_add_header(req1->output_headers, "Host", "127.0.0.1");
evhttp_make_request(conn, req1, EVHTTP_REQ_GET, "/"); // Ну здесь пока просто / запрашиваем, не принципиально пока
event_dispatch();
/* Здесь описываем отправку данных клиенту */
struct evbuffer *buf; // Создаем буфер
buf = evbuffer_new();
evbuffer_add_printf(buf, "%s", req->uri); // Допустим мы что-то в буфер заносим
evhttp_send_reply(req, HTTP_OK, "OK", buf); // Отправляем клиенту ответ
evbuffer_free(buf);
}
int main (int argc, char **argv)
{
struct evhttp *httpd;
event_init();
httpd = evhttp_start("0.0.0.0", 8080);
// Запускаем слушалку с коллбеком list_cb
evhttp_set_gencb(httpd, list_cb, NULL);
event_dispatch();
evhttp_free(httpd);
return 0;
}
P.S. evhttp потому что удобнее с заголовками работать.