epoll的一个使用例子
使用到主要函数有:
#include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */ };
1 #define EPOLL_SIZE 1024 2 int doServiceEpoll(int listenFd) 3 { 4 struct epoll_event events[EPOLL_SIZE]; 5 6 struct epoll_event event; 7 int epollFd = epoll_create1(EPOLL_CLOEXEC); 8 if(epollFd < 0) { 9 ERR_EXIT("epoll_create1"); 10 } 11 12 event.data.fd = listenFd; 13 event.events = EPOLLIN|EPOLLET; 14 if(epoll_ctl(epollFd, EPOLL_CTL_ADD, listenFd, &event) < 0) { 15 ERR_EXIT("epoll_ctl"); 16 } 17 18 int epollRet; 19 int i; 20 struct sockaddr_in cliAddr; 21 socklen_t len; 22 int acceptFd; 23 int epollNum = 1; 24 int readNum; 25 while(1) { 26 epollRet = epoll_wait(epollFd, events, epollNum, -1); 27 if(epollRet < 0) { 28 ERR_EXIT("epollRet"); 29 } else if(epollRet == 0) { 30 continue; 31 } 32 33 for(i = 0; i < epollRet; i++) { 34 if(events[i].data.fd == listenFd) { 35 memset(&cliAddr, 0, sizeof(cliAddr)); 36 len = sizeof(cliAddr); 37 if((acceptFd = accept(listenFd, (struct sockaddr *)&cliAddr, &len)) < 0) { 38 ERR_EXIT("accept"); 39 } 40 printf("recv a connect from %s, port %d, fd %d\n", 41 inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port), acceptFd); 42 epollNum++; 43 event.data.fd = acceptFd; 44 event.events = EPOLLIN|EPOLLET; 45 if(epoll_ctl(epollFd, EPOLL_CTL_ADD, event.data.fd , &event) < 0) { 46 ERR_EXIT("epoll_ctl"); 47 } 48 } 49 else if(events[i].events & EPOLLIN) { 50 if(events[i].data.fd < 0) { 51 continue; 52 } 53 readNum = handleRead(events[i].data.fd); 54 if(readNum == READ_ERROR) { 55 ERR_EXIT("handleRead"); 56 } else if(readNum == READ_CLOSE) { 57 event = events[i]; 58 if(epoll_ctl(epollFd, EPOLL_CTL_DEL, event.data.fd, &event) < 0) { 59 ERR_EXIT("epoll_ctl"); 60 } 61 epollNum--; 62 printf("client closed, remove %d\n", events[i].data.fd); 63 close(events[i].data.fd); 64 } 65 } 66 } 67 } 68 }
1. struct epoll_event events[EPOLL_SIZE];用于返回发生了哪些事件。
2. struct epoll_event event; 是一个临时变量,用于将我们想要监视的描述符通过 epoll_ctl 添加到集合中去。
3. epollNum 表示当前监视的描述符的个数。
4. epollRet 大于0时,表示有多少个文件描述符发生相关事件。 等于0时,表示超时。
5. accept时,需要将连接套接字通过epoll_ctl 添加到集合中去。当read收到FIN时,需要将连接套接字通过epoll_ctl 从集合中删去,并close此套接字。
转载于:https://www.cnblogs.com/superPerfect/p/3606554.html
epoll的一个使用例子相关推荐
- SAP MM采购定价过程的一个简单例子
SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...
- 用一个实际例子理解Docker volume工作原理
要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...
- 决策树的构造——一个手工例子
决策树的构造--一个手工例子 这个数据集来自Mitchell的机器学习,叫做是否去打网球play-tennis,以下数据仍然是从带逗号分割的文本文件,复制到纪事本,把后缀直接改为.csv就可以拿Exc ...
- 一个ioc例子jdk和spring版本导致问题
今天橘子松在做一个简单例子的时候,出现bug让我久久找了半小时... 天啊 不会吧 错误如下: java.lang.NoSuchMethodError: org.springframework.a ...
- SAP 电商云 Spartacus UI Proxy Facade 的一个实际例子
如何理解 SAP 电商云 Spartacus UI 中的 proxy facade? Jerry 这篇文章什么是 SAP 电商云 Spartacus UI 的 proxy façade提供了理论上的解 ...
- 用一个实际例子理解Docker volume工作原理 1
要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...
- MVVM模式的一个小例子
使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...
- 安装 PyTorch C++ API libtorch 及一个最小例子
安装 PyTorch C++ API libtorch 及一个最小例子 翻译自:https://pytorch.org/cppdocs/installing.html 我们提供依赖 PyTorch 所 ...
- 飞鸽传书举一个小例子
飞鸽传书举一个小例子,每个程序窗口右上角都有三个按钮,如最小化.关闭等.乔布斯觉得不好看,不易用,他提出改用红绿蓝的交通灯.这样修改后,果然 Mac OS 漂亮和易用了很多. 目前互联网和手机上的应用 ...
最新文章
- 购买Entrust SSL 数字证书?你怎么看?
- C语言实现-双链表练习
- 数据库不推荐使用外键的9个理由
- Visual Studio调试之断点基础篇
- MySQL_运算符与函数
- MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
- drupal 多语言_小小的开源机器人,Drupal的创造者,应对我们不断变化的经济,以及更多
- 记住这两点,彻底终结原型链吧
- java 程序找错_JAVA程序找错~
- Go语言【第十四篇】:Go语言基础总结
- 在WCF中的异常处理方法
- java win7 管理员权限_Win7下超级管理员创建普通权限任务
- Unity中使用VideoPlayer控制播放暂停进度条
- 计算机的色彩在哪调整w10,win10电脑显示器颜色不对如何调整
- 服务器系统补丁失败,windows2008系统更新补丁,以及失败解决方法
- 22. 协程与Python中的多任务异步协程
- ASPX页生成静态HTML页(五种方案)
- 北师18秋计算机在线作业考核,北师18秋《大学英语(三)》在线考核答案
- iOS 判断APP是否打开定位,并实现直接跳转打开定位
- @vue3 element-plus 按需引入,默认英文组件修改为中文
热门文章
- 数据库工作笔记018---MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法
- 关于图像质量评测的分析
- 一种动态组装SQL语句的方法
- 随想录(项目管理中的感受)
- xp 挂linux上网,XP系统挂载Linux NFS共享
- flask 返回json_flask中request.json做了什么
- java xml binding_JAXB(Java Architecture for XML Binding)
- php动态网页技术难点及分析,动态网页技术PHP关于cookie和session的分析
- php自动下载 linux,Linux下软件、PHP和Perl的模块等都实现了自动安装
- create 执行存储过程报错出现符号_记一次数据库迁移的过程采坑过程