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
的代码。