libevent 的bufferevent和evconnlistener用法(echo示例)
2015-11-02 10:02
369 查看
libevent 的bufferevent和evconnlistener用法(echo示例)
#include <arpa/inet.h> #include <errno.h> #include <event2/buffer.h> #include <event2/bufferevent.h> #include <event2/event.h> #include <event2/listener.h> #include <event2/thread.h> #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <string.h> #define LISTEN_BACKLOG 10 static void acceptErr(struct evconnlistener *listener,void *); static void accept_callbk(struct evconnlistener *listener,evutil_socket_t fd,struct sockaddr *sa,int , void *); static void readSock(struct bufferevent* bev,void *); static void sockEvent(struct bufferevent* bev,short events,void *); int main(int argc,char **argv) { // base struct event_base *base; base = event_base_new(); if(!base) { fprintf(stderr,"new base error.\n"); return -1; } //准备一个地址结构体并初始化 struct sockaddr_in addr; memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(9001); //准备一个evconnlistenner struct evconnlistener *listener; //初始化 设置accept回调函数 listener = evconnlistener_new_bind(base,accept_callbk,NULL, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, LISTEN_BACKLOG, (struct sockaddr *)&addr,sizeof(addr)); if(!listener) { perror("listen:"); return -1; } //设置accept的出错处理函数 evconnlistener_set_error_cb(listener,acceptErr); //进入事件循环 event_base_dispatch(base); } static void acceptErr(struct evconnlistener *listener,void *arg) { //获取base struct event_base *base = evconnlistener_get_base(listener); //获取错误字符 int err = EVUTIL_SOCKET_ERROR(); fprintf(stderr,"Get Error %d (%s)\n",err,evutil_socket_error_to_string(err)); event_base_loopexit(base,NULL); //如果有多个监听,只把这个监听端口shutdown } //[4] accept static void accept_callbk(struct evconnlistener *listener,evutil_socket_t fd,struct sockaddr *sa,int d, void *test) { //重要,获取base struct event_base *base = evconnlistener_get_base(listener); //获取client address //struct sockaddr_in *clientsa = (sockaddr_in*) sa; //下面是 bufferevent 的技术 struct bufferevent *bev = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE); //可以对这个bev设置:read_callbk,write_callbk,event_callbk bufferevent_setcb(bev,readSock,NULL,sockEvent,NULL); bufferevent_enable(bev,EV_READ | EV_WRITE); } static void readSock(struct bufferevent* bev,void *tmp) { printf("read data \n"); //evutil_socket_t fd = bufferevent_getfd(bev); struct evbuffer *input = bufferevent_get_input(bev); struct evbuffer *output = bufferevent_get_output(bev); evbuffer_add_buffer(output,input); //假设是个echo 服务 } static void sockEvent(struct bufferevent* bev,short event,void *ptr) { //出错处理 printf("sock Event \n"); if(event & BEV_EVENT_ERROR) { perror("Error form bufferevent"); } if(event & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { //获得socket //int sockfd = bufferevent_getfd(bev); bufferevent_free(bev); } }
相关文章推荐
- java-WEB中的监听器Lisener
- Android之使用Http协议实现文件上传功能
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- C#采用Winform实现类似Android的Listener
- 揭秘SQL Server 2014有哪些新特性(2)-固态硬盘 Buffer Pool(缓冲池) 扩展
- php中ob(Output Buffer 输出缓冲)函数使用方法
- php中mysql操作buffer用法详解
- libevent库的使用--定时器的使用实例
- Protocol Buffer技术深入理解(C++实例)
- mysqldump造成Buffer Pool污染的研究
- Linux下编译安装php libevent扩展实例
- Android View添加 Listener 实例代码
- Node.js中使用Buffer编码、解码二进制数据详解
- nginx高并发配置
- libevent 一个简单的event示例
- libevent 初始化与event_init
- libevent event_set函数与event_add函数解析 [SYM]
- libevent2 bufferevent应用示例
- 用pdo_oci 取数据报错或被截取 UTF-8 output gets truncated
- linux系统日志