使用到主要函数有:

#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的一个使用例子相关推荐

  1. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  2. 用一个实际例子理解Docker volume工作原理

    要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...

  3. 决策树的构造——一个手工例子

    决策树的构造--一个手工例子 这个数据集来自Mitchell的机器学习,叫做是否去打网球play-tennis,以下数据仍然是从带逗号分割的文本文件,复制到纪事本,把后缀直接改为.csv就可以拿Exc ...

  4. 一个ioc例子jdk和spring版本导致问题

    今天橘子松在做一个简单例子的时候,出现bug让我久久找了半小时... 天啊 不会吧 错误如下:   java.lang.NoSuchMethodError: org.springframework.a ...

  5. SAP 电商云 Spartacus UI Proxy Facade 的一个实际例子

    如何理解 SAP 电商云 Spartacus UI 中的 proxy facade? Jerry 这篇文章什么是 SAP 电商云 Spartacus UI 的 proxy façade提供了理论上的解 ...

  6. 用一个实际例子理解Docker volume工作原理 1

    要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...

  7. MVVM模式的一个小例子

    使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...

  8. 安装 PyTorch C++ API libtorch 及一个最小例子

    安装 PyTorch C++ API libtorch 及一个最小例子 翻译自:https://pytorch.org/cppdocs/installing.html 我们提供依赖 PyTorch 所 ...

  9. 飞鸽传书举一个小例子

    飞鸽传书举一个小例子,每个程序窗口右上角都有三个按钮,如最小化.关闭等.乔布斯觉得不好看,不易用,他提出改用红绿蓝的交通灯.这样修改后,果然 Mac OS 漂亮和易用了很多. 目前互联网和手机上的应用 ...

最新文章

  1. 购买Entrust SSL 数字证书?你怎么看?
  2. C语言实现-双链表练习
  3. 数据库不推荐使用外键的9个理由
  4. Visual Studio调试之断点基础篇
  5. MySQL_运算符与函数
  6. MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
  7. drupal 多语言_小小的开源机器人,Drupal的创造者,应对我们不断变化的经济,以及更多
  8. 记住这两点,彻底终结原型链吧
  9. java 程序找错_JAVA程序找错~
  10. Go语言【第十四篇】:Go语言基础总结
  11. 在WCF中的异常处理方法
  12. java win7 管理员权限_Win7下超级管理员创建普通权限任务
  13. Unity中使用VideoPlayer控制播放暂停进度条
  14. 计算机的色彩在哪调整w10,win10电脑显示器颜色不对如何调整
  15. 服务器系统补丁失败,windows2008系统更新补丁,以及失败解决方法
  16. 22. 协程与Python中的多任务异步协程
  17. ASPX页生成静态HTML页(五种方案)
  18. 北师18秋计算机在线作业考核,北师18秋《大学英语(三)》在线考核答案
  19. iOS 判断APP是否打开定位,并实现直接跳转打开定位
  20. @vue3 element-plus 按需引入,默认英文组件修改为中文

热门文章

  1. 数据库工作笔记018---MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法
  2. 关于图像质量评测的分析
  3. 一种动态组装SQL语句的方法
  4. 随想录(项目管理中的感受)
  5. xp 挂linux上网,XP系统挂载Linux NFS共享
  6. flask 返回json_flask中request.json做了什么
  7. java xml binding_JAXB(Java Architecture for XML Binding)
  8. php动态网页技术难点及分析,动态网页技术PHP关于cookie和session的分析
  9. php自动下载 linux,Linux下软件、PHP和Perl的模块等都实现了自动安装
  10. create 执行存储过程报错出现符号_记一次数据库迁移的过程采坑过程