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 ...
随机推荐
- react 通过 classnames 处理 多个class 的问题
react原生动态添加多个className会报错: import style from './style.css' <div className={style.class1 style.cla ...
- 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 ...
- 【Hibernate步步为营】--核心对象+持久对象全析(三)
上篇文章讨论了Hibernate持久对象的生命周期,在整个生命周期中一个对象会经历三个状态,三种状态的转换过程在开发过程中是可控的.并且是通过用法来控制它们的转化过程.详细的转化过程今天就来着重讨论下 ...
- Linux基础(2)- 用户、群组和权限
一.用户.群组和权限 1) 新建用户natasha,uid为1100,gid为555,备注信息为“master” 2) 修改natasha用户的家目录为/Natasha 3) 查看用户信息配置文 ...
- upstart man
man upstart nit(8) init(8) NAME init - Upstart process management daemon SYNOPSIS init [OPTION]... D ...
- 详谈kubernetes更新-2
系列目录 本文详细探索deployment在滚动更新时候的行为 要详细探讨的参数描述: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪性探测.判断p ...
- Fedora 25/24/23 nVidia Drivers Install Guide
https://www.if-not-true-then-false.com/2015/fedora-nvidia-guide/ search Most Popular Featured Linux ...
- Mac终端处理MySql
进入数据库: mysql -u root -p 随后输入密码:root 原文出处: GarveyCalvin的博客(@GarveyCalvin) MySQL有很多的可视化管理工具,比如“mysql ...
- C#获取Access数据库中的所有表名和列名
//C#获取Access数据库中的所有表名和列名 string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" ...
- KMP算法模式匹配
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/37832707 作者:小马 在一个长串中查找一个子串是较经常使用的操作.各种信息检索 ...