epoll + 多线程实现并发网络连接处理
2016-04-14 16:36
651 查看
【原】epoll + 多线程实现并发网络连接处理
简介触发方式
条件触发
边沿触发
主要的应用接口
1 Epoll的创建
根据man手册介绍, epoll_create(int size) 用来创建一个epoll实例,向内核申请支持size个句柄的资源(存储)。Size的大小不代表epoll支持的最大句柄个数,而隐射了内核扩展句柄存储的尺寸,也就是说当后面需要再向epoll中添加句柄遇到存储不够的时候,内核会按照size追加分配。在2.6以后的内核中,该值失去了意义,但必须大于0。
epoll_create执行成功,返回一个非负的epoll描述句柄,用来指定该资源,否则返回-1。
例子:
int epoll_fd = epoll_create(1);
2 Epoll的控制
Epoll的控制主要通过epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)完成。控制对象是用户申请的句柄,即fd;Epfd指定所控制的epoll资源;op指对fd的动作,包括向epoll中添加一个句柄EPOLL_CTL_ADD,删除一个句柄EPOLL_CTL_DEL,修改epoll对一个存在句柄的监控模式EPOLL_CTL_MOD;event指出需要让epoll对fd的监控模式(收、发、触发方式等)。epoll_ctl执行成功返回0,
否则返回-1。在介绍该接口之前,我们先看看内核对epoll的事件类型的定义
例子:
2.1 向epoll中增加句柄
2.1.1 增加新的常规句柄:
当向epoll中添加若干句柄后,就要进入监控状态,此时通过系统调用epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)完成。epoll_wait在执行的时候,在timeout内,将有动作的句柄的信息填充到event,event和maxevents决定了epoll监控句柄的上限。timeout的单位是微妙级别,当为-1时,除非内部句柄有动作,否则持续等待。epoll_wait执行成功返回有动作的句柄的总数,句柄信息在events中包含;如果在超时timeout内返回零,表示没有io请求的句柄;否则返回-1。
例程
下面是一个结合网上我做了修整的例子贴出来,简单总结一下epoll的用处。该例子是一个网络环回测试例程,服务器的地址默认,请求连接的端口号是11111。
相关文章推荐
- iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
- 使用virtualbox设置双网卡,桥接+内部网络
- 近期的安卓学习开发SOS APP的一些总结文档 (拨打电话 加载首页图片的异步代码 判断是否有网络代码)
- 模板方法模式
- 快速Android开发系列网络篇之Retrofit
- HTTP状态代码
- Android 主流网络请求框架 Android-async-http
- 配置本地IIS 启用Https访问
- HttpClient的使用实例
- TCP连接的11种状态变迁
- AFNetworking配置网络请求
- linux网络编程之shutdown() 与 close()函数详解
- 实现多路网络摄像头连接DM8168
- 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误
- Android 主流网络请求框架 Volley
- 网页浏览远程网络视频
- 解析网络视频真实地址
- TCP协议简单总结
- android6.0Okhttp网络请求
- http协议详解