libevent服务端,多线程应用

本文档展示了一个使用libevent库创建的多线程服务器示例,服务器通过创建多个event_base来处理不同任务,如连接请求、读写和关闭请求。在Windows上使用了IOCP模式,并利用线程安全的bufferevent进行读写操作。客户端连接时,新线程处理读写事件,避免阻塞主线程。同时,还展示了如何处理信号中断和错误回调。

 下面的方式是创建多个event_base来处理多线程的,主event_base用来处理连接请求,各个子event_base用来处理读写和关闭请求。

另一种方式是,所有的连接、读写、断开操作,都在一个event_base里面,然后当读到数据时,放入到子线程中处理,处理完了后再写,不过此时需要读写加锁,参考下列代码中的client_register_cb(...)

// TestServer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>

#ifdef _WIN32
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "event.lib")
#pragma comment(lib, "event_extra.lib")
#pragma comment(lib, "event_core.lib")
#else
#include <unistd.h>
#include <netinet/in.h>
#include <pthread.h>
# ifdef _XOPEN_SOURCE_EXTENDED
#  include <arpa/inet.h>
# endif
#include <sys/socket.h>
#define GetCurrentThreadId() pthread_self()
#endif

#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#include <event2/util.h>
#include <event2/event.h>
#include <event2/thread.h>

static const char MESSAGE[] = "Hello, World!\n";

static const int PORT = 9638;

static void listener_cb(struct evconnlistener *, evutil_socket_t,
    struct sockaddr *, int socklen, void *);
static void conn_writecb(struct bufferevent *, void *);
static void conn_readcb(struct bufferevent *, void *);
static void conn_eventcb(struct bufferevent *, short, void *);
static void signal_cb(evutil_socket_t, short, void *);
static void connlistener_errorcb(struct evconnlistener *, void *);

static bool init_client_dispatch();

int main2(int argc, char **argv)
{
    printf("the main thread id: %d\n",GetCurrentThreadId());
    struct event_base *base;
    struct evconnlistener *listener;
    struct event *signal_event;

    //其实 event_base_new(); 内部也是这么实现的
    struct event_config *cfg = event_config_new();
#ifdef WIN32
    WSADATA wsa_data;
    WSAStartup(0x0202, &wsa_data);
    //告诉libEvent使用Windows自己的线程和同步锁,并启用多线程安全
    evthread_use_windows_threads();
    //Windows启用IOCP模式
    event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP);
    //根据CPU实际数量配置libEvent的CPU数
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    event_confi
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值