2011-06-01 137 views
0

我一直在通过创建一个应用程序来学习C#,并且我碰到了一个难题,我真的很挣扎。c#SslStream.Read循环问题

基本上我有下面的代码是什么即时通讯使用从我已经设置的网络流中读取。它的工作原理是每次只读取1个数据包,sslstream.Read()解锁。这导致了大量的消息积压。

即时看到试图做的是,如果流读取的部分包含多个数据包读取它们。

我已经尝试了多次解决它,但我只是在一大堆代码结束了。

如果有人可以帮忙,我会很感激!

(每个分组的第一4字节是数据包的大小..分组范围的8个字节和28000个字节之间)

 SslStream _sslStream = (SslStream)_sslconnection; 
     int bytes = -1; 
     int nextread = 0; 
     int byteslefttoread = -1; 
     byte[] tmpMessage; 
     byte[] buffer = new byte[3000000]; 
     do 
     { 
      bytes = _sslStream.Read(buffer, nextread, 8192); 
      int packetSize = BitConverter.ToInt32(buffer, 0); 
      nextread += bytes; 
      byteslefttoread = packetSize - nextread; 

      if (byteslefttoread <= 0) 
      { 
       int leftover = Math.Abs(byteslefttoread); 
       do 
       { 
        tmpMessage = new byte[packetSize]; 
        Buffer.BlockCopy(buffer, 0, tmpMessage, 0, packetSize); 

        PacketHolder tmpPacketHolder = new PacketHolder(tmpMessage, "in"); 
        lock (StaticMessageBuffers.MsglockerIn) 
        { 
         //puts message into the message queue.. not very oop... :S 
         MessageInQueue.Enqueue(tmpPacketHolder); 
        } 
       } 
       while (leftover > 0); 

       Buffer.BlockCopy(buffer, packetSize , buffer, 0, leftover); 
       byteslefttoread = 0; 
       nextread = leftover; 

      } 

     } while (bytes != 0); 

回答

0

如果使用的.Net 3.5或更高我会强烈建议你看看Windows Communication Foundation (wcf)。它只是你通过网络尝试做的任何事情。

另一方面,如果你这样做纯粹是为了教育目的。 看看this link。您最好的选择是以较小的增量从流中读取数据,并将数据输入另一个数据流。一旦你可以确定你需要的信息的长度,你可以将第二个信息流剪切成消息。你可以设置一个外部循环来检查可用的字节,并等到它的值大于0时开始下一条消息。还应该注意,任何网络代码都应该在自己的线程上运行,以免阻塞UI线程。