草庐IT

EPOLLRDHUP

全部标签

tcp - EPOLLRDHUP 不可靠

我正在使用epoll_wait在客户端-服务器TCP连接上使用非阻塞读/写。问题是,我无法使用EPOLLRDHUP标志可靠地检测“peerclosedconnection”事件。经常发生没有设置标志的情况。客户端使用close()并且服务器在大多数情况下从epoll_wait接收到EPOLLIN|EPOLLRDHUP事件。正如预期的那样,读取产生零字节。不过,有时只有EPOLLIN出现,产生零字节。使用tcpdump进行的调查表明,据我所知正常关机发生了。我看到一个Flags[F.]、Flags[F.]、Flags[.]事件序列,它们应该对应于FIN、FIN和ACK。SO_LINGER

c - 给定任何 epoll TCP 套接字事件,如果 EPOLLRDHUP=0 且 EPOLLIN=1;后续调用 read()/recv() 是否保证返回不等于 0 的读取大小?

摘自epoll_ctl的手册:EPOLLRDHUP(sinceLinux2.6.17)Streamsocketpeerclosedconnection,orshutdownwritinghalfofconnection.(ThisflagisespeciallyusefulforwritingsimplecodetodetectpeershutdownwhenusingEdgeTriggeredmonitoring.)来自recv的手册:Ifnomessagesareavailabletobereceivedandthepeerhasperformedanorderlyshutdown