利用libevent做一个简单的服务器压力测试例子

这篇博客展示了如何利用libevent在服务器端处理多端口监听,以及客户端通过多线程发送数据到服务器并保存到不同文件。通过这个简单的例子,作者探讨了在模拟批量升级机器场景中的应用,同时提到了程序的CPU占用问题和未来改进的需求。
摘要由CSDN通过智能技术生成

小例子 服务器端用libevent 处理监听多个端口, 客户端多线程数据发送过来的时候写入对应不同文件中。

#include<stdio.h>
#include<string.h>
#include<errno.h>

#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>

#include<unistd.h>
#include<event.h>
#include<event2/event.h>

#define MAX_CONNECT_NUM 100   //暂定最大的连接数目
#define Port_Begin 10000               //侦听端口的其实端口号
#define DEF_TIME_OUT 20             //暂定超时调用时间设置20s
#define ONCE_READ_LEN 1000       //一次读取套接字的长度

//该结构体,本来想是构建传递给回调函数的
//但最终未用到,以后扩展可用
struct my_struct
{
	struct event_base* base;
	struct event *ev;
	int listener_fd[MAX_CONNECT_NUM];
	int connect_fd;
	int port_num;
	int index;
};
void accept_cb(int fd, short events, void* arg);
void socket_read_cb(int fd, short events, void *arg);
int tcp_server_init(int port, int listen_num);

//定义个全局变量用来记录每一个端口发送过来的数据长度
//由于公用回调函数,无法合适处理计数,借助粗犷的全局变量
int len_from_on_port[MAX_CONNECT_NUM];

int main(int argc, char** argv)
{
	struct event evtimeout;
	int i,listener[MAX_CONNECT_NUM];
	
	struct event_base* base = event_base_new();
	struct event* ev_listen[MAX_CONNECT_NUM]; 
	struct my_struct tran_struct;
	tran_struct.base = base;
        //再次循环建立多个监听端口,然后设置回调accept函数
	for(i=0; i<MAX_CONNECT_NUM; i++)
	{
		listener[i] = tcp_server_init(Port_Begin+i, 10);
		if( listener[i] == -1 )
		{
			perror(" tcp_server_init error ");
			return -1;
		}
		//tra
### 回答1: 好的,我会尽力为您提供一个使用libevent库的服务器例子Libevent一个强大的异步事件处理库,可以用于构建高性能的网络服务器。它提供了一个简单的API,使您可以创建基于事件的服务器,而无需手动管理线程和套接字。 以下是使用libevent服务器的示例代码: ```C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <event2/event.h> #include <event2/buffer.h> #include <event2/listener.h> #define PORT 8888 #define BACKLOG 10 // 定义事件回调函数 void accept_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int socklen, void *arg); void read_cb(struct bufferevent *bev, void *arg); void write_cb(struct bufferevent *bev, void *arg); void event_cb(struct bufferevent *bev, short events, void *arg); int main(int argc, char **argv) { // 创建事件处理器 struct event_base *base = event_base_new(); if (!base) { fprintf(stderr, "Error creating event base.\n"); return 1; } // 创建服务器地址 struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 创建监听器 struct evconnlistener *listener; listener = evconnlistener_new_bind(base, accept_cb, base, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, BACKLOG, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if (!listener) { fprintf(stderr, "Error creating listener.\n"); return 1; } // 开始事件循 ### 回答2: 下面是一个简单libevent服务器例子: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <event2/event.h> // 回调函数,处理客户端请求 static void handle_request(evutil_socket_t fd, short events, void *arg) { char buffer[1024]; struct event *ev = (struct event*)arg; int n = read(fd, buffer, sizeof(buffer)); if (n <= 0) { fprintf(stderr, "Client closed connection.\n"); event_free(ev); // 释放资源 close(fd); return; } write(fd, buffer, n); // 原样返回客户端请求数据 } int main() { struct event_base *base = event_base_new(); if (!base) { fprintf(stderr, "Couldn't create an event_base.\n"); return 1; } int listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd < 0) { perror("socket"); return 1; } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8080); addr.sin_addr.s_addr = INADDR_ANY; if (bind(listen_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } if (listen(listen_fd, 16) < 0) { perror("listen"); return 1; } struct event ev; // 添加事件,监听监听套接字 event_assign(&ev, base, listen_fd, EV_READ|EV_PERSIST, handle_request, &ev); event_add(&ev, NULL); printf("Server is running...\n"); event_base_dispatch(base); // 事件循环 event_base_free(base); // 释放资源 return 0; } ``` 这个服务器使用libevent库创建了一个事件循环,监听套接字上是否有新的连接请求。当有新的连接请求时,服务器会读取客户端的请求数据,并原样返回给客户端。服务器使用了非阻塞I/O,可以同时处理多个客户端请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值