高并发 libevent 服务器代码
时间: 2023-07-26 18:03:24 浏览: 113
libevent的视频服务器源代码
以下是一个简单的基于libevent的高并发服务器代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <event2/event.h>
#define SERVER_PORT 8888
#define BUFFER_SIZE 1024
void on_accept(int fd, short event, void *arg);
void on_read(int fd, short event, void *arg);
int main(int argc, char *argv[]) {
int server_fd, client_fd;
struct sockaddr_in server_addr;
struct event_base *base;
struct event *listen_event;
// 创建TCP socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket error");
return -1;
}
// 设置socket地址重用
int optval = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
// 绑定本地地址和端口
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind error");
return -1;
}
// 监听端口
if (listen(server_fd, 128) < 0) {
perror("listen error");
return -1;
}
// 初始化event库
base = event_base_new();
if (!base) {
perror("event_base_new error");
return -1;
}
// 创建listen事件
listen_event = event_new(base, server_fd, EV_READ | EV_PERSIST, on_accept, base);
event_add(listen_event, NULL);
// 进入事件循环
event_base_dispatch(base);
// 释放资源
event_base_free(base);
return 0;
}
void on_accept(int fd, short event, void *arg) {
struct event_base *base = (struct event_base *)arg;
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_fd;
// 接受新的连接
client_fd = accept(fd, (struct sockaddr *)&client_addr, &client_len);
if (client_fd < 0) {
perror("accept error");
return;
}
// 输出连接信息
printf("accept new client: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 创建读事件
struct event *read_event = event_new(base, client_fd, EV_READ | EV_PERSIST, on_read, NULL);
event_add(read_event, NULL);
}
void on_read(int fd, short event, void *arg) {
char buffer[BUFFER_SIZE];
int n;
// 读取数据
n = read(fd, buffer, BUFFER_SIZE);
if (n < 0) {
perror("read error");
return;
} else if (n == 0) {
// 客户端关闭连接
printf("client close the connection\n");
close(fd);
return;
}
// 输出收到的数据
printf("receive data from client: %s\n", buffer);
// 回复客户端
write(fd, buffer, n);
}
```
该服务器代码使用libevent实现了一个简单的回显服务器,能够处理多个客户端的连接和数据读写。在事件循环中,使用event_new()函数创建了一个listen事件,用于监听客户端连接请求;在on_accept回调函数中,使用event_new()函数创建了一个读事件,用于处理客户端的数据读取和回复。
阅读全文