1

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

基本上交易是这样的:

  1. 客户端 A 侦听传入连接
  2. 客户端 B 连接到 A 并发送一些数据
  3. 客户端 A 读取此数据以进行进一步处理

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

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

通常(除了这个特定的客户端之外,每次都会发出 FD_READ 信号,处理数据,然后发出 FD_CLOSE 信号,一切都很好,但在这里,FD_READ 我收到了 FD_CLOSE。

有人能告诉我这是怎么可能的吗?另一件事是该程序运行了大约一年,然后突然崩溃了。

4

2 回答 2

0

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

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

通常(除了这个特定的客户端之外,每次)都会发出 FD_READ 信号,处理数据,然后发出 FD_CLOSE 信号,一切都很好,但在这里,FD_READ 我收到了 FD_CLOSE。

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

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

客户端已关闭连接。

于 2013-02-21T23:29:46.417 回答
0

引用http://msdn.microsoft.com/en-us/library/windows/desktop/ms741576%28v=vs.85%29.aspx

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

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

如果错误代码不是 0,则说明有错误,丢失的数据可能会丢失。

于 2013-06-22T15:19:57.813 回答