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

0
Linux C/C++ Go 12399 次浏览

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

请尽量让自己的答案能够对别人有帮助

2个答案

默认排序 按投票排序