Sockets 当应该有FD_读取时,接收FD_关闭

Sockets 当应该有FD_读取时,接收FD_关闭,sockets,tcp,winsock2,Sockets,Tcp,Winsock2,我的一个客户工作站出现了一个奇怪的问题。我有一个简单的应用程序,可以在两个端点之间通过网络交换一些数据 交易基本上是这样的: 客户端A监听输入连接 客户端B连接到A并发送一些数据 客户端A读取此数据以进行进一步处理 现在奇怪的是客户端A没有接收整个数据(有时是缓冲区的一部分,有时是空的) A客户端使用WSAEventSelect函数,等待FD_READ读取B发送的数据,等待FD_CLOSE检测断开连接 通常(除了这一个特定的客户机外,每次都会发出FD_读取信号,处理数据,然后发出FD_关闭信号,

我的一个客户工作站出现了一个奇怪的问题。我有一个简单的应用程序,可以在两个端点之间通过网络交换一些数据

交易基本上是这样的:

  • 客户端A监听输入连接
  • 客户端B连接到A并发送一些数据
  • 客户端A读取此数据以进行进一步处理
  • 现在奇怪的是客户端A没有接收整个数据(有时是缓冲区的一部分,有时是空的)

    A客户端使用WSAEventSelect函数,等待FD_READ读取B发送的数据,等待FD_CLOSE检测断开连接

    通常(除了这一个特定的客户机外,每次都会发出FD_读取信号,处理数据,然后发出FD_关闭信号,一切正常,但在这里,FD_读取接收FD_关闭

    有人能告诉我这是怎么可能的吗?另一件事是,这个程序在大约一年的时间里运行良好,但突然崩溃了

    现在奇怪的是客户端A没有接收整个数据(有时是缓冲区的一部分,有时是空的)


    这并不奇怪,TCP就是这样工作的,只是在阻塞模式下永远不会收到零字节

    通常(除了这一个特定的客户机外,每次都会发出FD_读取信号,处理数据,然后发出FD_关闭信号,一切正常,但在这里,FD_读取接收FD_关闭

    请注意,FD_读取可以发出任意次数的信号,而不仅仅是一次。您不能保证在一次阅读中收到完整的邮件

    有人能告诉我这是怎么可能的吗

    客户端已关闭连接。

    引用

    “应用程序应在收到FD_CLOSE后检查剩余数据,以避免丢失数据的任何可能性。”

    因此,如果与FD_CLOSE通知相关联的错误代码为0,则应检查是否仍有数据要读取,这可能就是丢失数据的位置


    如果错误代码不是0,则表示发生了错误,丢失的数据可能会丢失。

    “在阻塞模式下,您将永远不会收到零字节”,是的,您会收到。这就是正常断开连接的报告方式,
    recv()
    返回0。我知道FD\u READ可以多次发出信号,但为什么它根本没有发出信号,而我只收到FD_CLOSE@RemyLebeau当然,但这不是接收零字节,而是使用零作为指示EOS的哨兵,这是可能的,因为你永远不会收到零字节。@Brukwa,因为没有什么可读的?大概客户端从未发送过任何数据。@EJP:获得
    FD\u CLOSE
    通知的唯一方法是连接正常关闭或异常丢失。您需要检查
    WSAEnumNetworkEvents()
    报告的错误代码以区分它们。如果您在等待
    FD\u READ
    时正在获得
    FD\u CLOSE
    ,则我怀疑连接正在异常关闭。