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 */
};
#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的一个使用例子的更多相关文章
- epoll 简单介绍及例子
第一部分:Epoll简介 . 当select()返回时,timeout参数的状态在不同的系统中是未定义的,因此每次调用select()之前必须重新初始化timeout和文件描述符set.实际上,秒,然 ...
- SQL Server Reporting Service(SSRS) 第一篇 我的第一个SSRS例子
很早就知道SQL SERVER自带的报表工具SSRS,但一直没有用过,最近终于需要在工作中一展身手了,于是我特地按照自己的理解做了以下总结: 1. 安装软件结构 SSRS全称SQL Server Re ...
- 一个简单例子:贫血模型or领域模型
转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...
- java连接mysql的一个小例子
想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- MVVM模式的一个小例子
使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...
- Lea指令计算地址(用于四则混合运算),附上一个函数调用例子及其反汇编代码,很清楚
比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子: push ebp mov esp, ebp sub ...
- (转)Java中使用正则表达式的一个简单例子及常用正则分享
转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...
- C语言多线程的一个简单例子
多线程的一个简单例子: #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
随机推荐
- byte 单位换算
1G就1GB啦,平时人们说1G只是简洁来说而已. bit(位).B(字节).K(千).M(兆).G(吉咖).T(太拉) B(Byte).KB(KiloByte).MB(MegaByte).GB(Gig ...
- 1079. Total Sales of Supply Chain (25)【树+搜索】——PAT (Advanced Level) Practise
题目信息 1079. Total Sales of Supply Chain (25) 时间限制250 ms 内存限制65536 kB 代码长度限制16000 B A supply chain is ...
- 深入浅出WPF----第五章----控件与布局
你可以把控件想象成一个容器,容器里装的东西就是它的内容.控件的内容可以直接是数据,也可以是控件.当控件的内容还是控件的时候就形成了控件的嵌套.我们把被嵌套的控件称为子级控件,这种控件嵌套在U1布局时尤 ...
- ORCAD元件属性白色区域和黄色区域的理解
白色部分为instance属性,黄色部分为occurence 属性 在平坦式电路中,黄色部分是默认不显示的. 在层次式电路中,黄色部分会显示. 如果这两个区域的Reference不同,以黄色 ...
- 顺序容器vector,deque,list的选用规则
前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(v ...
- NVIDIA GPU架构与原理分析(一)——GPU简介与主流Fermi、Kepler架构GPU概述
1 GPU简介 图形处理单元GPU英文全称Graphic Processing Unit,GPU是相对于CPU的一个概念,NVIDIA公司在1999年发布GeForce256图形处理芯片时首先提出GP ...
- 使用 HttpWebRequest 向网站提交数据
HttpWebRequest 是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过 HTTP 协议和服务器交互. HttpWebRequest 对 HTTP 协议进行 ...
- 零基础学python-2.18 异常
这一节说一下异常except 继续沿用上一节的代码.我有益把文件名称字搞错.然后在结尾部分加上异常捕捉: try: handler=open("12.txt")#在这里我特别将文件 ...
- 2016/07/07 apmserv5.2.6 Apache启动失败,请检查相关配置。MySQL5.1已启动。
因为要用PHP做一个程序,在本机上配PHP环境,下了个APMServ5.26,安装很简单,不再多说,装好后,启动,提示错误,具体是:“Apache启动失败,请检查相关配置.√MySQL5.1已启动”, ...
- 【BZOJ4956】lydsy七月月赛 I 乱搞
[BZOJ4956]lydsy七月月赛 I 题面 题解:傻题,Floyd传递闭包即可~ #include <cstdio> #include <cstring> #includ ...