gpt4 book ai didi

c - 通过 epoll 处理监听套接字

转载 作者:行者123 更新时间:2023-12-01 11:56:47 25 4
gpt4 key购买 nike

以下全部来自 man epoll页:

The function do_use_fd() uses the new ready file descriptor until EAGAIN is returned by either read(2) or write(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);
}
}

所以对于 read/write操作,我们应该通过循环直到 EAGAIN已收到;但为什么 accept 不是这种情况?

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

或者也许我错过了什么?

最佳答案

看看监听socket是如何添加到epollfd的:

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

它不是在边缘触发中添加的,而是在电平触发中添加的。所以不需要循环直到 EAGAIN在那一个。

关于c - 通过 epoll 处理监听套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6401642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com