Linux Epoll和远程单向关机
假设本地linux主机上的TCP套接字与远程主机处于连接状态。本地主机正在使用epoll_wait来通知远程主机套接字上的事件 如果远程主机要调用:Linux Epoll和远程单向关机,linux,sockets,tcp,epoll,Linux,Sockets,Tcp,Epoll,假设本地linux主机上的TCP套接字与远程主机处于连接状态。本地主机正在使用epoll_wait来通知远程主机套接字上的事件 如果远程主机要调用: shutdown(s,SHUT_WR); 在其连接的套接字上,指示已完成传输,epoll_wait将在本地主机上为其套接字返回什么事件 我假设EPOLLIN总是会被返回,随后的recv调用将返回0,以指示远程端已完成传输 那EPOLLHUP和EPOLLRDHUP呢?(这两个事件之间有什么区别) 甚至EPOLLERR 如果远程主机调用“关闭”而不
shutdown(s,SHUT_WR);
在其连接的套接字上,指示已完成传输,epoll_wait将在本地主机上为其套接字返回什么事件
我假设EPOLLIN总是会被返回,随后的recv调用将返回0,以指示远程端已完成传输
那EPOLLHUP和EPOLLRDHUP呢?(这两个事件之间有什么区别)
甚至EPOLLERR
如果远程主机调用“关闭”而不是“关机”,上述任何一个问题的答案是否会改变?我在做了繁重的工作以找到答案后自己回答这个问题 侦听epoll事件的套接字通常会在远程对等方调用close或shutdown(SHUT_WR)时收到一个EPOLLRDUP(除EPOLLIN外)事件标志。这并不一定意味着插座没有电了。对recv()的后续调用将返回套接字上的所有未读数据,最终将返回“0”以指示EOF。如果远程对等方只关闭了其套接字的一半,则甚至可以将数据发送回 一个值得注意的例外是,如果远程对等方正在使用其套接字上启用的SO_LINGER选项,其LINGER值为“0”。关闭此类套接字的结果可能导致发送TCP RST而不是FIN。据我所知,连接重置事件将生成EPOLLHUP或EPOLLERR。(我还没来得及证实,但这是有道理的) 有一些文档表明,有一些较旧的Linux实现不支持EPOLLHUP,例如生成EPOLLHUP
值得一提的是,在我的特殊情况下,我发现编写用于特殊情况EPOLLHUP或EPOLLRDHUP事件的代码并不太有趣。相反,只需将这些事件与EPOLLIN/epolout一样处理,并调用recv()(或根据需要调用send())。但是请密切注意从recv()和send()返回的返回代码。我对这里的行为有更多的疑问,因此我对这些交互进行了详细的研究: