用libevent实现httpserver

最近工作中需要实现一些审计功能,软件是服务器端程序,对于展示来说,在浏览器上能直接查看可能是最直接最友好的方式了,libevent中提供了http模块,正好我们的软件也依赖这个,所以决定用它来实现一个httpserver,用来展示相关数据。不多说,直接上代码表示这个工作流程


#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/http.h>

 
bool startHttpServer(const char* ip, int port, void (*cb)(struct evhttp_request *, void *), void *arg)
{
    //创建event_base和evhttp
    event_base* base = event_base_new();
    evhttp* http_server = evhttp_new(base);
    if (!http_server) {
        return false;
    }
    //绑定到指定地址上
    int ret = evhttp_bind_socket(http_server, ip, port & 0xFFFF);
    if (ret != 0) {
        return false;
    }
    //设置事件处理函数
    evhttp_set_gencb(http_server, cb, arg);
    //启动事件循环,当有http请求的时候会调用指定的回调
    event_base_dispatch(base);
    evhttp_free(http_server);
    return true;
}
 
 
void MyHttpServerHandler(struct evhttp_request* req, void* arg)
{
    //创建要使用的buffer对象
    evbuffer* buf = evbuffer_new();
    if (!buf) {
        return;
    }
 
    //获取请求的URI
    const char* uri = (char*)evhttp_request_get_uri(req);
 
    //添加对应的HTTP代码
    evbuffer_add_printf(buf,"<html>");
    evbuffer_add_printf(buf,"<head><title>MyHttpServer</title></head>");
    evbuffer_add_printf(buf, "<body>");
 
    //根据URI显示不同的页面
    if (strcmp(uri, "/") == 0) {
        evbuffer_add_printf(buf,"<p>Welcome to my http server</p>");
    } else if (strcmp(uri, "/about") == 0) {
        evbuffer_add_printf(buf,"<p>I love C++</p>");
    }
    evbuffer_add_printf(buf, "</body>");
    evbuffer_add_printf(buf,"</html>");
 
    //回复给客户端
    evhttp_send_reply(req, HTTP_OK, "OK", buf);
    evbuffer_free(buf);
}
 
 
int main(int argc, char** argv)
{
    //Windows 平台套接字库的初始化
#ifdef WIN32
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif
 
    //启动服务在地址 127.0.0.1:9000 
    startHttpServer("127.0.0.1", 9000, MyHttpServerHandler, NULL);
 
#ifdef WIN32
    WSACleanup();
#endif
    return 0;
}
 
 
 


好了,编译运行:


再看看about的页面


一个简单的httpserver就这样实现了,当然这里只是简单描述了这个工作流程,实际项目中还是根据不同的需求来实现不同的页面输出的。



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
libevent是一个开源的事件驱动库,可以用来开发高并发的网络应用程序。下面是一个使用libevent实现的简单的HTTP服务器示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <event2/event.h> #include <event2/http.h> void http_cb(struct evhttp_request *req, void *arg) { const char *uri = evhttp_request_get_uri(req); printf("Request URI: %s\n", uri); struct evbuffer *evb = evbuffer_new(); if (evb == NULL) { fprintf(stderr, "Failed to create evbuffer\n"); evhttp_send_error(req, HTTP_INTERNAL, "Internal Server Error"); return; } evbuffer_add_printf(evb, "Hello World!"); evhttp_send_reply(req, HTTP_OK, "OK", evb); evbuffer_free(evb); } int main(int argc, char *argv[]) { struct event_base *base = event_base_new(); if (base == NULL) { fprintf(stderr, "Failed to create event_base: %s\n", strerror(errno)); return EXIT_FAILURE; } struct evhttp *httpd = evhttp_new(base); if (httpd == NULL) { fprintf(stderr, "Failed to create evhttp: %s\n", strerror(errno)); return EXIT_FAILURE; } if (evhttp_bind_socket(httpd, "0.0.0.0", 8080) != 0) { fprintf(stderr, "Failed to bind to 0.0.0.0:8080: %s\n", strerror(errno)); return EXIT_FAILURE; } evhttp_set_cb(httpd, "/", http_cb, NULL); printf("HTTP server started on 0.0.0.0:8080\n"); event_base_dispatch(base); evhttp_free(httpd); event_base_free(base); return EXIT_SUCCESS; } ``` 这个HTTP服务器监听本地8080端口,处理根路径的请求,返回"Hello World!"。可以使用curl命令测试: ``` $ curl http://localhost:8080/ Hello World! ``` 这只是一个简单的示例,实际的HTTP服务器需要更多的功能和处理逻辑。libevent提供了丰富的API和事件处理机制,可以很方便地实现高并发、高性能的网络应用程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值