c - 为什么我在全新的套接字上收到 EPOLLHUP 事件

标签 c linux sockets epoll

我有一些代码在虚拟机上运行时由于某种原因出现异常。

初始化的顺序是:

s_listen = socket(...)
bind(s_listen, ...)
epoll_ctl(epfd, EPOLL_CTL_ADD, s_listen, ...)
listen(s_listen, SOMAXCONN)

在调用 bind 之前,epoll 文件描述符上有一个事件循环/线程运行和处理事件。

该事件循环在调用新创建的 s_listen 套接字上的 listen() 之前获得 EPOLLHUP。

所以我的问题是,为什么我会在全新的套接字上收到 EPOLLHUP 事件?

当我在调用 listen() 之后放置 epoll_ctl 时,错误消失了,但是如果它们在套接字添加到 epoll 之前进入,是否会导致错过一些潜在的连接事件?

最佳答案

正如我在评论中的示例所示,似乎您无法在套接字正确初始化之前对其进行轮询,除非您想处理 EPOLLHUP

至于问题,不,你不会错过任何事件。调用 listen() 然后调用 epoll() 与您在其他情况下必须执行的操作相同(listen() + 阻塞 accept( ));这些调用之间的实际传入连接由内核处理并等待直到您的代码处理它们。

关于c - 为什么我在全新的套接字上收到 EPOLLHUP 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14765203/

相关文章:

c - 整数 a 和 *(&a) 有什么区别?

linux - CentOS 6 VNC 服务器拒绝连接

java - Socket + readline = 空指针异常

断开连接后C STREAM客户端套接字重用

java - Python 套接字客户端到 Java 套接字服务器

c - C 中的返回值

c++ - 对齐的结构/类对象的填充字节中存储哪些值

c - 为什么 scanf 抓取\n?

linux - 如何将库链接到执行文件

linux - 从 scala 代码执行的 Shell 命令无法识别 bash 别名