- 论坛徽章:
- 0
|
epoll循环如下:
while (1) {
nfds = epoll_wait(kdpfd, events, curfds, -1);
if (nfds == -1) {
perror("epoll_wait");
break;
} else {
fprintf(stderr, "===>nfds is: %d\n", nfds);
}
for (n = 0; n < nfds; ++n) {
if (events[n].events & EPOLLIN) {
if (events[n].data.fd == listener) {
fprintf(stderr, "^^^in event: new client[%d]\n", events[n].data.fd);
///////////////////////
new_fd = accept(listener, (struct sockaddr *) &their_addr,
&len);
if (new_fd < 0) {
perror("accept");
continue;
} else {
fprintf(stderr, "connection from: %s:%d, sockfd is:%d\n",
inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);
}
setnonblocking(new_fd);
ev.events = EPOLLIN | EPOLLET | EPOLLOUT;
ev.data.fd = new_fd;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, new_fd, &ev) < 0) {
fprintf(stderr, "add sockfd '%d' to epoll fail%s\n",
new_fd, strerror(errno));
return -1;
}
curfds++;
///////////////////////
} else {
fprintf(stderr, "^^^in event: old client[%d]\n", events[n].data.fd);
}
}
if (events[n].events & EPOLLOUT) {
fprintf(stderr, "^^^out event\n");
}
}
}
经过测试发现,如果用telnet连接上了两个客户端,在一个客户端上按键盘的话,nfds返回1,返回的这个
fd读事件,写事件都检测到了,(并且每次按键盘,写事件都能检测得到)
问题是: 既然EPOLLOUT事件每次都能检测到,那么如果有两个客户端,nfds的值应该是2啊(因为有两个)
客户端socket都可写,为何nfds总是返回1? |
|