使用到主要函数有:

#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 */
};
 #define EPOLL_SIZE 1024
int doServiceEpoll(int listenFd)
{
struct epoll_event events[EPOLL_SIZE]; struct epoll_event event;
int epollFd = epoll_create1(EPOLL_CLOEXEC);
if(epollFd < ) {
ERR_EXIT("epoll_create1");
} event.data.fd = listenFd;
event.events = EPOLLIN|EPOLLET;
if(epoll_ctl(epollFd, EPOLL_CTL_ADD, listenFd, &event) < ) {
ERR_EXIT("epoll_ctl");
} int epollRet;
int i;
struct sockaddr_in cliAddr;
socklen_t len;
int acceptFd;
int epollNum = ;
int readNum;
while() {
epollRet = epoll_wait(epollFd, events, epollNum, -);
if(epollRet < ) {
ERR_EXIT("epollRet");
} else if(epollRet == ) {
continue;
} for(i = ; i < epollRet; i++) {
if(events[i].data.fd == listenFd) {
memset(&cliAddr, , sizeof(cliAddr));
len = sizeof(cliAddr);
if((acceptFd = accept(listenFd, (struct sockaddr *)&cliAddr, &len)) < ) {
ERR_EXIT("accept");
}
printf("recv a connect from %s, port %d, fd %d\n",
inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port), acceptFd);
epollNum++;
event.data.fd = acceptFd;
event.events = EPOLLIN|EPOLLET;
if(epoll_ctl(epollFd, EPOLL_CTL_ADD, event.data.fd , &event) < ) {
ERR_EXIT("epoll_ctl");
}
}
else if(events[i].events & EPOLLIN) {
if(events[i].data.fd < ) {
continue;
}
readNum = handleRead(events[i].data.fd);
if(readNum == READ_ERROR) {
ERR_EXIT("handleRead");
} else if(readNum == READ_CLOSE) {
event = events[i];
if(epoll_ctl(epollFd, EPOLL_CTL_DEL, event.data.fd, &event) < ) {
ERR_EXIT("epoll_ctl");
}
epollNum--;
printf("client closed, remove %d\n", events[i].data.fd);
close(events[i].data.fd);
}
}
}
}
}

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此套接字。

epoll的一个使用例子的更多相关文章

  1. epoll 简单介绍及例子

    第一部分:Epoll简介 . 当select()返回时,timeout参数的状态在不同的系统中是未定义的,因此每次调用select()之前必须重新初始化timeout和文件描述符set.实际上,秒,然 ...

  2. SQL Server Reporting Service(SSRS) 第一篇 我的第一个SSRS例子

    很早就知道SQL SERVER自带的报表工具SSRS,但一直没有用过,最近终于需要在工作中一展身手了,于是我特地按照自己的理解做了以下总结: 1. 安装软件结构 SSRS全称SQL Server Re ...

  3. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  4. java连接mysql的一个小例子

    想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...

  5. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  6. MVVM模式的一个小例子

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

  7. Lea指令计算地址(用于四则混合运算),附上一个函数调用例子及其反汇编代码,很清楚

    比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子:     push   ebp     mov   esp,   ebp     sub ...

  8. (转)Java中使用正则表达式的一个简单例子及常用正则分享

    转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...

  9. C语言多线程的一个简单例子

    多线程的一个简单例子: #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

随机推荐

  1. 首先使用flex制作table

    HTML(JavaScript) <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  2. C#向Sql数据库插入空值的控制

    string name = textBox1.Text; int age = Convert.ToInt32(textBox2.Text.Trim()); ? null : (int?)Convert ...

  3. C99_变长结构体实现

    /************************************************************************* > File Name: C99_lengt ...

  4. (9)launcher3 之 外部 更换主题Theme APP demo 实现原理以及demo

    先说下我的思路: luancher3里面更换图标的逻辑例如以下: 先从APP资源包里查询--数据库查询--其它地方查询ICON 因此,我们仅仅须要把 从数据库获取ICON 代码提前到  从APP资源包 ...

  5. 服务管理-DNS

    DNS服务 DNS(Domain Names System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址.通 ...

  6. 加载jsp页面报#{} is not allowed in template text

    问题是在引进jQueryUI时遇到 解决方法: 在page指令添加:             deferredSyntaxAllowedAsLiteral="true" 例如:&l ...

  7. 在字符串资源文件里加入HTML元素,直接使用字符串资源,HTML元素没起作用的解决的方法

    escape  html  in string resource 一. 需求描写叙述 给TextView赋值res资源库中的字符串资源,注意这里是一个string资源,要实现以下的效果 "未 ...

  8. 【剑指Offer学习】【面试题62:序列化二叉树】

    题目:请实现两个函数,分别用来序列化和反序列化二叉树. 解题思路 通过分析解决前面的面试题6.我们知道能够从前序遍历和中序遍历构造出一棵二叉树.受此启示.我们能够先把一棵二叉树序列化成一个前序遍历序列 ...

  9. jQuery功能强大的图片查看器插件

    简要教程 viewer是一款功能强大的图片查看器jQuery插件.它可以实现ACDsee等看图软件的部分功能.它可以对图片进行移动,缩放,旋转,翻转,可以前后浏览一组图片.该图片查看器还支持移动设备, ...

  10. redis事务和乐观锁

    1 MULTI/EXEC 执行本事务. MULTI set foo bar get foo set foo hello EXEC 在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行.没有回滚 ...