【问题标题】:Why am I getting the EPOLLHUP event on a brand new socket为什么我在全新的套接字上收到 EPOLLHUP 事件
【发布时间】:2013-01-23 18:49:03
【问题描述】:

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

初始化顺序为:

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之前进入,是否会导致错过一些潜在的连接事件?

【问题讨论】:

  • 我已经有一段时间没有使用民意调查和朋友了,但我不记得在正确设置之前向民意调查集添加过 fd(即,在调用 accept、@987654325 之后) @ 或 listen)。你确定给一个epoll set添加一个未初始化的socket是有效的吗?
  • 绝对有效。您甚至可以在连接/绑定/接受之前添加任何有效的套接字。
  • This code 打印:“事件:err=0,hup=16”。所以你真的确定它是有效的吗? (好吧,我猜 POLLHUP 是有效的,但你明白我的意思。)
  • 该链接将我带到“未知的过去bin id”。无论如何,改变事物的顺序并过滤事件正确地解决了它。
  • 我已将到期时间设置为 1 天;我重新上传了它here,现在过期了 1 个月。

标签: c linux sockets epoll


【解决方案1】:

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

至于问题,不,您不会错过任何活动。调用listen() 然后epoll() 与您必须做的相同(listen() + 阻塞accept());这些调用之间的实际传入连接由内核处理并一直等待直到您的代码处理它们。

【讨论】:

  • 不,这是不正确的。一旦对 socket() 的调用完成,您的套接字就处于活动状态。即,就 TCP/IP 而言,它是一个正确初始化的套接字。我有其他代码可以创建非阻塞,将其添加到 epoll 并调用 connect。当 epoll_wait 返回一个可写事件时,我知道它已连接。在这段代码中,我没有看到 HUP 事件。
  • 查看我对 pastebin 代码的其他评论。未初始化的(即在连接/侦听之前)套接字似乎总是导致 EPOLLHUP(至少在阻塞模式下)。
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多