小例子 服务器端用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