为什么即使在NetworkStream.EndRead返回0字节后我仍然在接收数据?

时间:2012-03-21 14:21:26

标签: .net windows sockets networkstream

我正在使用NetworkStream.BeginRead / EndRead从套接字进行异步读取。

但是,NetworkStream.EndRead()有时返回0(即从套接字读取0个字节)我认为套接字已关闭,但这不是真的,因为如果我一直调用BeginRead(),我最终会收到更多数据。

这不是从socket / NetworkStream连续读取数据的正确循环吗?

void BeginContinousRead()
{
  // Start the continous async read
  mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}

private void ProcessNetworkStreamRead(IAsyncResult result)
{
  // This will sometimes be zero?!
  int bytesRead = mStream.EndRead(result);

  // Continue reading more data and call this callback method again over and over, etc.
  mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}

根据MSDN,我应该使用NetworkStream.DataAvailable属性来确定套接字上是否有更多数据可用,但即使更多数据可能会在以后到达,这也是假的。

例如,根据MSDN,这应该是我的回调:

private void ProcessNetworkStreamRead(IAsyncResult result)
{
  // This will sometimes be zero?!
  int bytesRead = mStream.EndRead(result);

  while (mStream.DataAvailable)
    mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}

...但这不能正常工作,因为DataAvailable变为FALSE然后我的连续读取停止并且从不再读取任何数据。

在另一端关闭套接字或我选择关闭套接字之前,继续读取数据的正确异步方法是什么?

1 个答案:

答案 0 :(得分:0)

不是检查bytesRead或DataAvailable属性来检查套接字是否已关闭,而是将调用包装到BeginRead并捕获IOException。那应该告诉你套接字是否关闭。