无法找出手册中的epoll示例

问题描述 投票:0回答:1

最近,我正在学习系统调用epoll。我已经有关于此主题的基本概念,但我陷入了手册给出的示例中。

/* Code to set up listening socket, 'listen_sock',
              (socket(), bind(), listen()) omitted */

epollfd = epoll_create1(0);
if (epollfd == -1) {
   perror("epoll_create1");
   exit(EXIT_FAILURE);
}

ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
   perror("epoll_ctl: listen_sock");
   exit(EXIT_FAILURE);
}

for (;;) {
   nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
   if (nfds == -1) {
       perror("epoll_wait");
       exit(EXIT_FAILURE);
   }

   for (n = 0; n < nfds; ++n) {
       if (events[n].data.fd == listen_sock) {
           conn_sock = accept(listen_sock,
                              (struct sockaddr *) &addr, &addrlen);
           if (conn_sock == -1) {
               perror("accept");
               exit(EXIT_FAILURE);
           }
           setnonblocking(conn_sock);
           ev.events = EPOLLIN | EPOLLET;
           ev.data.fd = conn_sock;
           if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
                       &ev) == -1) {
               perror("epoll_ctl: conn_sock");
               exit(EXIT_FAILURE);
           }
       } else {
           do_use_fd(events[n].data.fd);
       }
   }
}

以下是我的假设:

  • 以上是服务器代码。
  • [listen_sock是从服务器中socket()返回的文件描述符。

我的问题是:

  1. 文件描述符events[n].data.fd是什么意思?是服务器的fd还是客户端的?

  2. 为什么events[n].data.fd == listen_sock,那么我们需要创建一个新的连接?

c sockets epoll
1个回答
0
投票

您可以查看epoll_wait的手册页,以获取有关struct epoll_event及其data成员的详细信息,并帮助理解代码。

任何给定的events[n].data.fd都指的是具有某种事件的fd。它可以是侦听套接字,也可以是客户端套接字(如果存在活动的客户端连接)。

如果活动为[[is]的fd listen_sock侦听套接字,则意味着新客户端正在尝试连接。此时,我们将连接accept并将新的conn_sock fd添加到epollfd的集合中。

© www.soinside.com 2019 - 2024. All rights reserved.