从libevent文档中,我了解到当从远程对等端接收到TCP段时,会生成EV_READ事件。在以下情况下会发生什么
- 已在套接字上注册读写事件的非阻塞应用程序
- 场景A:应用程序正在等待事件。它从远程获取FIN,生成EV_READ事件,应用程序进行读取(或recv)并获取0
- 场景B:应用程序正在发送数据。当发送正在执行时,它从远程获取FIN。申请会得到EPIPE吗(我想是的)。是否还会为应用程序获得EPIP的同一FIN生成EV_READ事件
一个相关的问题是,如果发送和写入与本文中提到的类似,那么为什么ECONNRESET不是像这里的手册页面中那样在写入中生成,而是像这里的手动页面中描述的那样在发送中生成。
如何编写一个远程对等,以便本地发送返回ECONNRESET。感谢您的任何回答
场景A:应用程序正在等待事件。它从远程获取FIN,生成EV_READ事件>,应用程序进行读取(或recv)并获取0
是的,没错。
场景B:应用程序正在发送数据。在执行发送>时,它从远程获取FIN。申请会得到EPIPE吗(我想是的)。是否还会为应用程序获得EPIPE 的同一FIN生成EV_READ事件>
是的,将生成EV_READ事件。(当然,前提是您没有同时关闭()套接字)。
然而,在这种非常特殊的情况下,您不会在写入时出现错误。当您从对等端获得FIN时,TCP连接只关闭了一半。传入的FIN只是简单地表示"我没有什么要发送的了"。但你可以向它发送更多的数据。或者,您可以关闭()套接字,导致从您一侧到对等方的FIN,现在TCP连接被认为是关闭的,因为您都发送了FIN数据包。
在这一点上,它取决于对等方实际做了什么,是调用close()还是shutdown()。在随后的write()中,如果对等应用程序关闭了其套接字并且对等方发送了RST,则您可能会得到EPIPE或ECONNRESET,或者如果对等方已被编码为接收更多数据,则您可以继续向其发送数据。
请注意,您只是在描述一个特定的案例。根据时间和网络或对等端发生的事情,还有很多很多情况需要考虑。
如何编写一个远程对等,以便本地发送返回ECONNRESET。
如果对等方在仍有数据要读取的情况下执行close()操作,则会发生这种情况对等端的本地缓冲区。在这种情况下,发送RST时,写入/发送将出现ECONNRESET错误,读取()/recv()也是如此。
要生成这种情况,只需不读取()任何内容,等待一段时间,直到您确定一些数据已经到达,然后关闭()套接字。稍后在另一端的write()将获得ECONNRESET。ECONNRESET之后的另一个write()应该得到EPIPE。