使用 epoll 进行网络异步编程(大量并发连接情况)
来源:互联网 发布:高仿永硕网盘源码 编辑:程序博客网 时间:2024/05/05 10:50
通常的TCP编程都是每个 进程/线程 对应一个连接。但是实际应用中常常是大量的连接并发连接到一个进程/线程上来。这样我们就需要网络I/O的多路复用,之前用的较多的是 select和poll。select 和 poll的时间复杂度是 O(n), 而本文将介绍的epoll时间复杂度是 O(1),epoll是基于事件的,而select模型是基于轮询的。这样如果有大量连接的话 epoll 的优势显而易见。
下面介绍使用方法:
1)创建一个 epoll 的 descriptor
epfd = epoll_create(EPOLL_QUEQU_LEN);
说明:
EPOLL_QUEUE_LEN 是epoll的最大连接数。epoll_create()函数的返回值是一个指向epoll的文件描述符,使用完成后需要使用 close()关掉。
2)创建完成后可以使用如下方式来调用:
static struct epoll_event ev;
int client_sock;
ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP
ev.data.fd = client_sock;
int res = epoll_ctl(epfd, EPOLL_CTL_ADD, client_sock, &ev);
说明:
ev是epoll参数的结构体,用于配置epoll,EPOLL_CTL_ADD 是说将socket添加到epoll中去。
3)接下来程序就可以等待事件发生然后由内核来调用相应的回调函数了。
while (1) {
// wait for something to do…
int nfds = epoll_wait(epfd, events,
MAX_EPOLL_EVENTS_PER_RUN,
EPOLL_RUN_TIMEOUT);
if (nfds < 0) die("Error in epoll_wait!");
// for each ready socket
for(int i = 0; i < nfds; i++) {
int fd = events[i].data.fd;
handle_io_on_socket(fd);
}
}
来自:http://www.linuxpig.com/category/%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83linux%E6%9C%8D%E5%8A%A1%E5%99%A8/
- 使用 epoll 进行网络异步编程(大量并发连接情况)
- 使用epoll进行高性能网络编程(收藏)
- 使用epoll进行高性能网络编程
- 使用epoll进行高性能网络编程
- 使用epoll进行高性能网络编程
- 使用epoll进行高性能网络编程
- 高并发网络编程epoll
- 使用Tornado进行网络异步编程
- 使用Tornado进行网络异步编程
- 使用Tornado进行网络异步编程
- Linux网络编程( epoll函数的使用) 多路IO 高并发服务器
- [转]使用epoll进行高性能网络编程
- [转]使用epoll进行高性能网络编程
- [转]使用epoll进行高性能网络编程
- linux中使用select和epoll确定异步connect连接是否成功 标签: 网络编程服务器异步connectSO_ERRORsocket 2016-07-31 23:07 1008人阅读 评
- linux网络编程并发进程,select和epoll(一)
- linux网络编程并发进程,select和epoll(二)
- epoll + 多线程实现并发网络连接处理
- 管理undo tablespace
- ububtu一键安装lamp
- Go语言并发之美
- where条件顺序不同,性能不同吗?
- @+id/android:list"和"@android:id/list"的写法
- 使用 epoll 进行网络异步编程(大量并发连接情况)
- poj1979 DFS
- 助力微信本地化信息系统v1.0版本
- 面试技巧平面图形题
- Java多线程(一)、理解进程与多线程的概念及关系
- Java编程思想--组合,继承,代理
- win7打开jar文件的问题,双击无法运行
- Computer System: A Programmer's Perspective (深入理解计算机系统) 读书总结
- From Activity