evhttp绑localhost
时间: 2025-09-04 14:11:21 AIGC 浏览: 6
在 `evhttp` 中绑定 `localhost`,通常可以使用 `evhttp_bind_socket` 函数。不过参考内容里主要提到了 `evhttp_accept_socket` 和 `evhttp_accept_socket_with_handle` 函数,虽然这两个函数不能直接用于绑定 `localhost`,但能在绑定好 `localhost` 对应的套接字后,让 `http server` 接受来自该套接字的连接。
要绑定 `localhost`,可以先创建一个监听 `localhost` 地址和指定端口的套接字,然后可以使用 `evhttp_accept_socket` 或 `evhttp_accept_socket_with_handle` 函数让 `http server` 接受这个套接字的连接。以下是一个示例代码,展示了如何实现这个过程:
```c
#include <event2/event.h>
#include <event2/http.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
void generic_handler(struct evhttp_request *req, void *arg) {
struct evbuffer *buf;
buf = evbuffer_new();
if (buf == NULL) return;
evbuffer_add_printf(buf, "Hello, World!\n");
evhttp_send_reply(req, HTTP_OK, "OK", buf);
evbuffer_free(buf);
}
int main() {
struct event_base *base;
struct evhttp *http;
evutil_socket_t listenfd;
struct sockaddr_in sin;
// 创建事件库实例
base = event_base_new();
if (!base) {
fprintf(stderr, "Could not initialize libevent!\n");
return 1;
}
// 创建 HTTP 服务器实例
http = evhttp_new(base);
if (!http) {
fprintf(stderr, "Could not initialize evhttp!\n");
event_base_free(base);
return 1;
}
// 设置通用处理函数
evhttp_set_gencb(http, generic_handler, NULL);
// 创建监听套接字
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0) {
perror("socket");
evhttp_free(http);
event_base_free(base);
return 1;
}
// 绑定到 localhost(127.0.0.1)和指定端口(例如 8080)
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_port = htons(8080);
if (bind(listenfd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
perror("bind");
close(listenfd);
evhttp_free(http);
event_base_free(base);
return 1;
}
// 开始监听
if (listen(listenfd, 10) < 0) {
perror("listen");
close(listenfd);
evhttp_free(http);
event_base_free(base);
return 1;
}
// 让 http server 接受来自监听套接字的连接
if (evhttp_accept_socket(http, listenfd) != 0) {
fprintf(stderr, "evhttp_accept_socket failed!\n");
close(listenfd);
evhttp_free(http);
event_base_free(base);
return 1;
}
// 进入事件循环
event_base_dispatch(base);
// 清理资源
close(listenfd);
evhttp_free(http);
event_base_free(base);
return 0;
}
```
在上述代码中,首先创建了一个事件库实例和一个 `evhttp` 实例,然后创建了一个监听 `localhost`(`127.0.0.1`)和端口 `8080` 的套接字。接着使用 `evhttp_accept_socket` 函数让 `http server` 接受这个套接字的连接,最后进入事件循环等待客户端连接。
阅读全文
相关推荐






