您的位置:首页 > 理论基础 > 计算机网络

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的事件类型的定义

该结构中我们主要看epoll_event。epoll_event->data涵盖了调用epoll_ctl增加或者修改某指定句柄时写入的信息,epoll_event->event,则包含了返回事件的位域。
例子:
2.1 向epoll中增加句柄

2.1.1 增加新的常规句柄:

2.1.2 增加网络监听句柄

2.2 修改某个句柄的模式

2.3 删除某个句柄

3 Epoll的监控
当向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。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: