libevent实现http服务器
时间: 2023-10-29 22:07:58 浏览: 48
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和事件处理机制,可以很方便地实现高并发、高性能的网络应用程序。