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_关闭信号,
这并不奇怪,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
,则我怀疑连接正在异常关闭。