Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Epoll和远程单向关机_Linux_Sockets_Tcp_Epoll - Fatal编程技术网

Linux Epoll和远程单向关机

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 如果远程主机调用“关闭”而不

假设本地linux主机上的TCP套接字与远程主机处于连接状态。本地主机正在使用epoll_wait来通知远程主机套接字上的事件

如果远程主机要调用:

 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()返回的返回代码。

我对这里的行为有更多的疑问,因此我对这些交互进行了详细的研究: