使用 epoll 进行网络异步编程(大量并发连接情况)

通常的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/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值