Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用epoll处理监听套接字_C_Sockets_Epoll - Fatal编程技术网

C 用epoll处理监听套接字

C 用epoll处理监听套接字,c,sockets,epoll,C,Sockets,Epoll,以下所有内容均来自man epoll页面: 函数do_use_fd()使用新的 就绪文件描述符 直到EAGAIN通过读取(2)或写入(2)返回 ET触发的代码示例: for(;;) { nfds = epoll_wait(kdpfd, events, maxevents, -1); for(n = 0; n < nfds; ++n) { if(events[n].data.fd == listener) {

以下所有内容均来自
man epoll
页面:

函数do_use_fd()使用新的 就绪文件描述符 直到EAGAIN通过读取(2)或写入(2)返回

ET触发的代码示例

   for(;;) {
       nfds = epoll_wait(kdpfd, events, maxevents, -1);

       for(n = 0; n < nfds; ++n) {
           if(events[n].data.fd == listener) {
               client = accept(listener, (struct sockaddr *) &local,
                               &addrlen);
               if(client < 0){
                   perror("accept");
                   continue;
               }
               setnonblocking(client);
               ev.events = EPOLLIN | EPOLLET;
               ev.events = EPOLLIN | EPOLLET;
               ev.data.fd = client;
               if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
                   fprintf(stderr, "epoll set insertion error: fd=%d\n",
                           client);
                   return -1;
               }
           }
           else
               do_use_fd(events[n].data.fd);
       }
   }
(;;)的
{
nfds=epoll_wait(kdpfd,events,maxevents,-1);
对于(n=0;n
所以对于
read/write
操作,我们应该通过循环直到收到
EAGAIN
为止;但是为什么
accept

在上面的代码中,当有多个客户端套接字等待接受时,会错过一些请求,因为它只接受1客户端套接字,我们还应该将其包装在一个循环中,直到
EAGAIN
收到


或者可能我遗漏了什么?

看看如何将侦听器套接字添加到
epollfd

ev.events = EPOLLIN;       // this is the crucial bit
ev.data.fd = listen_sock;

它不是在边缘触发中添加的,而是在级别触发中添加的。因此,在该循环上添加
EAGAIN
之前,不需要循环。

@Mat,如果在ET模式下(
|EPOLLET
)将
listen\u sock
添加到epollfd,您将如何处理它?我上面的代码是错误的,对吗?手册页中的代码是正确的,因为它没有在侦听器套接字上设置ET模式。如果您在ET模式下添加侦听器,那么您需要采取额外的预防措施并循环,直到EAGAIN。但是要小心饥饿。@Mat,上面关于
listen\u sock
的代码是从
man epoll
页面上引用的吗?差不多。您发布的内容缺少一些错误检查,并且有一行粘贴了两次,但除此之外,它的结构是相同的。由于您引用了该手册页,我假设您的设置代码与其中的设置代码相同。@Mat,似乎我的人已经过时,
man,版本1.6d
,没有关于
listen\u sock
的代码。