.NET NetworkStream.Length缺乏支持的解决方法

时间:2012-04-03 20:05:45

标签: c# asyncsocket .net

......基本上就是标题所说的内容。 NetworkStream.Length未实现。还有什么选择?

我正在尝试制作一系列递归回调,这些回调包含对NetworkStream.BeginRead(...)的调用。要知道我何时遇到基本情况并收到所有字节,我需要知道流中的字节长度。有解决方法吗?

代码(此代码的入口点是在TcpListern.BeginAcceptTcpClient调用之后写入。:

private void StartRead(IAsyncResult ar)
{
   try
   {
      //Do an initial read:
      AsyncClient client = (AsyncClient)ar.AsyncState;
      int amountRead = 0;
      try
      {
         amountRead = client.ClientStream.EndRead(ar);
      }
      catch (IOException io)
      {
         ProcessDebugLog("Async read complete", io);
         client.ClientStream.Close();
         return;
      }
      string text = Encoding.UTF8.GetString(client.Bytes, 0, amountRead);

      //If TCP segmentation has occurred, more blocks will have
      // to get read in:
      if (client.ClientStream.Position < client.ClientStream.Length /*EXCEPTION HERE*/)
      {
         try
         {
            client.ClientStream.BeginRead(client.Bytes, 0, client.Bytes.Length, StartRead, client);
         }
         catch (IOException io)
         {
            ProcessDebugLog("Async read complete", io);
            client.ClientStream.Close();
         }
      }
      else
      {
         client.ClientStream.Close();
      }
   }
   catch (Exception ex)
   {
      ProcessDebugLog("ERROR - StartRead", ex);
   }
}

1 个答案:

答案 0 :(得分:3)

  

......基本上就是标题所说的内容。 NetworkStream.Length未实现。还有什么选择?

你继续阅读直到流的结尾。 无法替代 - 在关闭流之后,总会有更多数据。

如果您控制协议,那么如果流可以包含多个“消息”,则应对每条消息进行长度前缀。 (您可以使用分隔符作为替代,但这更麻烦。)

请注意,在获得所有数据之前,你应从二进制文件解码到,你应该使用Decoder保持“未完成”字符的状态 - 如果你的阅读最终在角色中途分裂。