初识Libevent

libevent是用c写的高并发网络io库,只要有文件描述符,就都可使用libevent。

libevent使用回调函数(callback) 。

有了libevent,网络编程我有

1, FIFO的进程间通信。

利用FIFO的进程间通信read端:

#include <event2/event.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #define MYFIFO "myfifo" //call back
void readcb(evutil_socket_t fd, short what, void* arg){
//read fifo
char buf[24] = {0};
int len = read(fd, buf, sizeof(buf));
buf[len] = '\0';
printf("data len = %d, buf = %s\n", len, buf);
printf("read event:%s\n", what & EV_READ ? "Yes" : "No");
} int main(){
unlink(MYFIFO);
mkfifo(MYFIFO, 0664); int fd = open(MYFIFO, O_RDONLY | O_NONBLOCK);
//int fd = open(MYFIFO, O_RDONLY); struct event_base* base;
base = event_base_new(); //create event
struct event* ev = NULL;
ev = event_new(base, fd, EV_READ | EV_PERSIST | EV_ET, readcb, NULL); //add event
event_add(ev, NULL); //start
event_base_dispatch(base); //free event
event_free(ev);
event_base_free(base);
close(fd); return 0;
}

利用FIFO的进程间通信write端:

#include <event2/event.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h> #define MYFIFO "myfifo" //call back
void writecb(evutil_socket_t fd, short what, void* arg){
//write fifo
char buf[24] = {0};
static int num = 0;
sprintf(buf, "num = %d", num++);
write(fd, buf, strlen(buf) + 1);
} int main(){ int fd = open(MYFIFO, O_WRONLY | O_NONBLOCK); struct event_base* base;
base = event_base_new(); //create event
struct event* ev = NULL;
ev = event_new(base, fd, EV_WRITE | EV_PERSIST | EV_ET, writecb, NULL); //add event
event_add(ev, NULL); //start
event_base_dispatch(base); //free event
event_free(ev);
event_base_free(base);
close(fd); return 0;
}

2, socket通信。

server端:

#include <event2/event.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <event2/bufferevent.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <event2/listener.h> //write callback
void write_cb(struct bufferevent* bev, void* ctx){
printf("all is sent\n");
} //read callback
void read_cb(struct bufferevent *bev, void *ctx){
char buf[64];
size_t ret = bufferevent_read(bev, buf, sizeof(buf));
buf[ret] = '\0';
printf("server recf:%s\n", buf); bufferevent_write(bev, "hahaha", 6);
} //event callback
void event_cb(struct bufferevent *bev, short what, void *ctx){ if(what & BEV_EVENT_EOF){
printf("EOF\n");
}
if(what & BEV_EVENT_CONNECTED){
printf("connected\n");
}
} //listener call back
void listencb(struct evconnlistener* listener, evutil_socket_t fd,
struct sockaddr* cli, int len, void* ptr){ struct event_base* base = evconnlistener_get_base(listener);
struct bufferevent* bev =
bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); //set callback function
bufferevent_setcb(bev, read_cb, write_cb, event_cb, NULL);
bufferevent_enable(bev, EV_READ | EV_WRITE); //set water
bufferevent_setwatermark(bev, EV_READ, 10, 0);
bufferevent_setwatermark(bev, EV_WRITE, 1, 2); } int main(int argc, char** argv){ int port = atoi(argv[1]);
struct event_base* base;
base = event_base_new();
if(!base){
perror("event_base_new");
exit(1);
} struct sockaddr_in s;
s.sin_family = AF_INET;
s.sin_port = htons(port);
s.sin_addr.s_addr = htonl(INADDR_ANY);
struct evconnlistener* listener =
evconnlistener_new_bind(base, listencb, NULL, LEV_OPT_CLOSE_ON_FREE,
-1, (struct sockaddr*)&s, sizeof(s));
if(!listener){
perror("bind");
exit(1);
}
event_base_dispatch(base);
event_base_free(base);
}

client端:

#include <event2/event.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <event2/bufferevent.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <event2/listener.h>
#include <event2/dns.h>
#include <stdlib.h>
#include <event2/util.h> //read write callback
void readcb(struct bufferevent *bev, void *ctx){
char buf[64];
size_t ret = bufferevent_read(bev, buf, sizeof(buf));
buf[ret] = '\0';
printf("client recf:%s\n", buf); } //event callback
void eventcb(struct bufferevent *bev, short what, void *ctx){
if(what & BEV_EVENT_CONNECTED){
printf("connect okay\n");
}
else if(what & BEV_EVENT_ERROR){
struct event_base* base = ctx;
int err = bufferevent_socket_get_dns_error(bev);
if(err){
printf("DNS error:%s\n", evutil_gai_strerror(err));
}
printf("closing\n");
bufferevent_free(bev);
event_base_loopexit(base, NULL);
}
} //terminal read callback
void termicb(evutil_socket_t fd, short what, void* ptr){
char buf[64] = {0};
int len = read(fd, buf, sizeof(buf));
buf[len] = '\0';
printf("in termicb\n");
struct bufferevent* bev = ptr;
bufferevent_write(bev, buf, len);
}
int main(int artc, char** argv){ struct event_base* base;
base = event_base_new(); struct evdns_base* dns_base;
dns_base = evdns_base_new(base, 1); struct bufferevent* bev;
bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE); int port = atoi(argv[2]);
bufferevent_setcb(bev, readcb, NULL, eventcb, base);
bufferevent_enable(bev, EV_READ);
bufferevent_socket_connect_hostname(bev, dns_base, AF_INET, argv[1], port); struct event* ev = event_new(base, STDIN_FILENO, EV_READ | EV_PERSIST, termicb, bev);
event_add(ev, NULL);
event_base_dispatch(base);
event_base_free(base);
}

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

最新文章

  1. 东京区域2012-2014主要消费产品价格参考表——Excel
  2. Android代码中设置背景图片
  3. CentOS 7.2 修改主机名
  4. [Python 3.x 官方文档翻译]The Python Tutorial Python教程
  5. IOS中 类扩展 xib
  6. Python高手之路【十二】面向对象设计模式
  7. Ubuntu 16.04系统下安装PHP5.6*
  8. Es6 新增函数
  9. 201521123004 《Java程序设计》第7周学习总结
  10. entityManager分页
  11. java 并发包runnable 与 callable
  12. this 指向问题, 三个例子
  13. STM32 CRC-32 Calculator Unit
  14. webpack window 安装loader
  15. JQUERY伸缩导航
  16. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
  17. 迎来OO的曙光,总结规格的意义——OO第四次博客总结
  18. 十五、springboot集成定时任务(Scheduling Tasks)(二)之(线程配置)
  19. Unity5.0与Android交互
  20. Django在Eclipse下配置启动端口号

热门文章

  1. ssd训练之bug:Invalid JPEG data or crop window, data size 565248
  2. 项目那几步走:先配置setting路径文件、创建数据库、执行数据库迁移命令、配置mysql数据库信息、注册app、注释中间件、pymysql替换mysqldb-配置urls路由-继续视图函数-然后HTML页面展示-HTML里面导入css文件、models配置数据库表、
  3. 安装QTP之后造成环境变量java冲突问题的解决方案
  4. Angular7入门总结篇
  5. 【oracle】update
  6. NOIP模拟赛 迷路
  7. 使用Python拆分数据量大的CSV文件(亲测有效)
  8. 前端Jquery总是提示$符未定义
  9. VMware虚拟机安装Centos7后设置静态ip
  10. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入