Sockets 带非阻塞套接字的libevent:如果远程对等方在执行本地发送时发送RST*,本地是否也会读取EV_

Sockets 带非阻塞套接字的libevent:如果远程对等方在执行本地发送时发送RST*,本地是否也会读取EV_,sockets,send,recv,libevent,Sockets,Send,Recv,Libevent,从libevent文档中,我了解到当从远程对等方接收到TCP段时,会生成EV_读取事件。在下面的场景中会发生什么 已在套接字上注册读写事件的非阻塞应用程序 场景A:应用程序正在等待事件。它从远程获取FIN,生成EV_读取事件,应用程序执行读取(或recv)并获取0 场景B:应用程序正在发送数据。它在执行发送时从远程获取FIN。应用程序是否会得到一个EPIPE(我想是的)。是否还会为应用程序获取EPI的同一FIN生成EV_读取事件 一个相关的问题是,如果发送和写入与中提到的类似,那么为什么Econ

从libevent文档中,我了解到当从远程对等方接收到TCP段时,会生成EV_读取事件。在下面的场景中会发生什么

  • 已在套接字上注册读写事件的非阻塞应用程序
  • 场景A:应用程序正在等待事件。它从远程获取FIN,生成EV_读取事件,应用程序执行读取(或recv)并获取0
  • 场景B:应用程序正在发送数据。它在执行发送时从远程获取FIN。应用程序是否会得到一个EPIPE(我想是的)。是否还会为应用程序获取EPI的同一FIN生成EV_读取事件
  • 一个相关的问题是,如果发送和写入与中提到的类似,那么为什么EconReset不是在手动页面中的写入中生成,而是在手动页面中的发送中生成

    如何编写远程对等点,以便本地发送返回一个EconReset。谢谢你的回答

    场景A:应用程序正在等待事件。它从远程获取FIN,生成EV_读取事件>,应用程序执行读取(或recv)并获取0

    是的,没错

    场景B:应用程序正在发送数据。当发送>执行时,它从远程获取FIN。应用程序是否会得到一个EPIPE(我想是的)。是否还会为应用程序获得EPIPE的同一FIN生成EV_READ event>

    是,将生成EV_读取事件。(当然前提是您没有同时关闭()套接字)

    然而,在这种非常特殊的情况下,您不会在写入时出错。当您从对等端获得一个FIN时,TCP连接只关闭了一半。传入的FIN仅仅意味着“我没有更多的东西要发送”。但是你可以向它发送更多的数据。 或者,您可以关闭()套接字,从而产生从您一侧到对等方的FIN,现在TCP连接被认为是关闭的,因为您已经发送了FIN数据包

    此时,它取决于对等方实际做了什么,是调用close()还是shutdown()。 在后续的write()中,如果对等应用程序关闭其套接字并发送RST,您可能会得到EPIPE或EconReset,或者如果对等应用程序已编码为接收更多数据,您可能会继续发送数据

    请注意,您只描述了一个特定案例。根据时间和网络上或对等体上发生的事情,还有很多其他的情况需要考虑。 如何编写远程对等点,以便本地发送返回一个EconReset

    如果对等方在仍有数据要读入时执行close()操作,则会发生这种情况 对等端的本地缓冲区。在这种情况下,发送RST时,write/send将与read()/recv()一样使用ECONNRESET出错

    要生成这种情况,只需不读取()任何内容,等待一段时间,直到确定某些数据已到达,然后关闭()套接字。另一端稍后的write()将获得EconReset。EconReset之后的另一个write()应该得到EPIPE

    场景A:应用程序正在等待事件。它从远程获取FIN,生成EV_读取事件>,应用程序执行读取(或recv)并获取0

    是的,没错

    场景B:应用程序正在发送数据。当发送>执行时,它从远程获取FIN。应用程序是否会得到一个EPIPE(我想是的)。是否还会为应用程序获得EPIPE的同一FIN生成EV_READ event>

    是,将生成EV_读取事件。(当然前提是您没有同时关闭()套接字)

    然而,在这种非常特殊的情况下,您不会在写入时出错。当您从对等端获得一个FIN时,TCP连接只关闭了一半。传入的FIN仅仅意味着“我没有更多的东西要发送”。但是你可以向它发送更多的数据。 或者,您可以关闭()套接字,从而产生从您一侧到对等方的FIN,现在TCP连接被认为是关闭的,因为您已经发送了FIN数据包

    此时,它取决于对等方实际做了什么,是调用close()还是shutdown()。 在后续的write()中,如果对等应用程序关闭其套接字并发送RST,您可能会得到EPIPE或EconReset,或者如果对等应用程序已编码为接收更多数据,您可能会继续发送数据

    请注意,您只描述了一个特定案例。根据时间和网络上或对等体上发生的事情,还有很多其他的情况需要考虑。 如何编写远程对等点,以便本地发送返回一个EconReset

    如果对等方在仍有数据要读入时执行close()操作,则会发生这种情况 对等端的本地缓冲区。在这种情况下,发送RST时,write/send将与read()/recv()一样使用ECONNRESET出错


    要生成这种情况,只需不读取()任何内容,等待一段时间,直到确定某些数据已到达,然后关闭()套接字。另一端稍后的write()将获得EconReset。EconReset之后的另一个write()应该得到EPIPE。

    场景B:接收
    FIN
    不会导致您无法继续发送数据。你的意思是不是说RST?注意write()声明“根据连接到fd的对象,可能会发生其他错误。”。这包括EconReset。场景B:接收
    FIN
    不会导致您无法继续发送数据。你的意思是不是说RST?注意write()声明“根据连接到fd的对象,可能会发生其他错误。”。这包括Econreset。