边缘触发的 epoll 关闭时缺少 0 字节读取

边缘触发的 epoll 关闭时缺少 0 字节读取

我试图了解是否可以使用边缘触发的 epoll 并避免每次都需要多次调用 recv() 来从 epoll 触发的 READ 事件中读取数据......

epoll 手册页指出,对于边缘触发的 epoll,如果 bytes_read < bytes_requested,则停止从套接字读取是可以接受的,因为套接字缓冲区显然已耗尽,我们可以返回 epoll_wait。https://man7.org/linux/man-pages/man7/epoll.7.html

对于面向流的文件(例如管道、FIFO、流套接字),还可以通过检查从目标文件描述符读取/写入的数据量来检测读/写I/O空间耗尽的情况。例如,如果您通过要求读取一定量的数据来调用 read(2),并且 read(2) 返回的字节数较少,则可以确定已耗尽文件描述符的读取 I/O 空间。

但是,我不明白这是如何解决套接字关闭问题的。

假设服务器向客户端发送 128 字节并立即关闭套接字。现在,客户端在 epoll_wait 上速度很慢,并且在一个边沿触发的 EPOLLIN 事件中接收到数据事件和关闭事件。如果我将 128 个字节读入 4k 缓冲区,如何避免再次调用 read 来检查套接字是否已关闭?根据联机帮助页,如果我读取的字节数少于我要求的字节数,则不必再次调用 read 。但是,这如何解释套接字被关闭的可能性呢?

如果我不再调用 read,我可能会错过关闭事件。现在看来我必须调用 read至少每次我收到 ET EPOLLIN 事件都会两次...我觉得我一定在这里错过了一些东西。

相关内容