用最简单的方式实现基于libevent框架的http client客户端

本文介绍了如何利用libevent框架,以最简单的方法创建一个HTTP客户端。通过参考作者之前的服务端代码,读者可以理解客户端的实现过程。
摘要由CSDN通过智能技术生成
#include <event2/event_struct.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/http.h>
#include <evhttp.h>

void http_request_done(struct evhttp_request *req, void *arg)
{
    printf("send request ok...\n");
    size_t len = evbuffer_get_length(req->input_buffer);
    unsigned char * str = evbuffer_pullup(req->input_buffer, len);
    char buf[256] = { 0 };
    memcpy(buf, str, len);
    if(str == NULL)
    {
        printf("len = %d, str == NULL\n", len);
    }
    else
    {
        printf("len = %d, str = %s\n", len, buf);
    }

    event_base_loopbreak((struct event_base*)arg);
}

int main()
{
    struct event_base* base;
    struct evhttp_connection* conn;
    struct evhttp_request* req;

    base = event_base_new();
    //conn = evhttp_connection_new(base, NULL, "192.168.1.109", 8081);
    conn = evhtt
基于libevent实现TCP客户端和服务端主要是利用其异步事件处理机制,简化网络编程的复杂性。libevent是一个高效的、跨平台的事件驱动框架,特别适合用于实时应用和网络服务器。 **TCP客户端示例**: ```cpp #include <event2/event.h> void on_connect(struct evconnbase *cb, short revents) { if (revents & EV_ERROR) { perror("Connect failed"); return; } struct sockaddr_in server_addr; // ...填充服务器地址... int fd = accept(cb->ev_base->fd, (struct sockaddr *)&server_addr, NULL); if (fd == -1) { perror("Accept failed"); return; } event_set(&client_event, fd, EV_READ | EV_PERSIST, on_read, cb); event_add(&client_event, NULL); } void on_read(struct evconnbase *cb, short revents) { if (revents & EV_TIMEOUT) { fprintf(stderr, "Read timeout\n"); return; } char buf[1024]; ssize_t n = read(cb->fd, buf, sizeof(buf)); if (n <= 0) { if (n == 0) printf("Connection closed by peer\n"); else perror("Read error"); event_del(&client_event); } else { // 发送响应或数据处理 } } int main() { // 初始化libevent event_init(); // 创建连接事件 struct event_base *base = event_base_new(); struct evconnbase *client_event = evconnbase_new(base, on_connect); // 连接服务器,设置超时等 // ...实际连接过程... // 主循环 while (1) { event_base_dispatch(base); } event_base_free(base); event_system_exit(0); } ``` **TCP服务端示例**: ```cpp void on_connection(struct evconnbase *cb, short revents) { if (revents & EV_ERROR) { perror("Connection failed"); return; } struct sockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); int fd = accept(cb->ev_base->fd, (struct sockaddr *)&client_addr, &addr_len); if (fd == -1) { perror("Accept failed"); return;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值