使用 libevent 创建了一个简单的 TCP 服务器
时间: 2024-04-15 18:30:22 浏览: 101
你好!要创建一个简单的 TCP 服务器,你可以使用 libevent 库来处理网络事件。下面是一个使用 libevent 创建 TCP 服务器的基本示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <event2/event.h>
#include <event2/listener.h>
void handle_client(struct bufferevent *bev, void *ctx) {
char msg[1024];
size_t len = bufferevent_read(bev, msg, sizeof(msg));
msg[len] = '\0';
printf("Received message: %s\n", msg);
bufferevent_write(bev, "Server received your message\n", 29);
}
void accept_conn_cb(struct evconnlistener *listener, evutil_socket_t fd,
struct sockaddr *address, int socklen, void *ctx) {
struct event_base *base = evconnlistener_get_base(listener);
struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, handle_client, NULL, NULL, NULL);
bufferevent_enable(bev, EV_READ | EV_WRITE);
}
void accept_error_cb(struct evconnlistener *listener, void *ctx) {
struct event_base *base = evconnlistener_get_base(listener);
int err = EVUTIL_SOCKET_ERROR();
fprintf(stderr, "Error %d: %s\n", err, evutil_socket_error_to_string(err));
event_base_loopexit(base, NULL);
}
int main() {
struct event_base *base = event_base_new();
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(8080);
struct evconnlistener *listener = evconnlistener_new_bind(base, accept_conn_cb, NULL,
LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
-1, (struct sockaddr*)&sin, sizeof(sin));
if (!listener) {
perror("Failed to create listener");
return 1;
}
evconnlistener_set_error_cb(listener, accept_error_cb);
event_base_dispatch(base);
evconnlistener_free(listener);
event_base_free(base);
return 0;
}
```
这个示例代码会在本地的 8080 端口上创建一个 TCP 服务器。当有客户端连接时,服务器会接收客户端发送的消息,并将其打印出来。然后服务器会回复一个简单的消息给客户端。
你可以根据自己的需求修改和扩展这个示例代码。希望对你有帮助!如果还有其他问题,请随时提问。
阅读全文