c#SslStream.Read循环问题

时间:2011-06-01 21:13:46

标签: c# .net networkstream sslstream

我一直在通过创建一个应用程序来学习C#,而且我遇到了一个障碍,我真的很挣扎。

基本上我有下面的代码是我用来从我设置的网络流中读取的代码。它可以工作,但每次sslstream.Read()取消阻塞时,它只能读取1个数据包。这会导致大量的消息积压。

我正在尝试做的是,如果流读取的部分包含多个数据包,则全部读取它们。

我已多次尝试解决这个问题,但我最终陷入了一大堆代码。

如果有人能提供帮助,我会很感激!

(每个数据包的前4个字节是数据包的大小..数据包的范围在8个字节到28,000个字节之间)

        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);

1 个答案:

答案 0 :(得分:0)

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

另一方面,如果你这样做纯粹是出于教育目的。 看看this link。您最好的选择是以较小的增量读取流,并将该数据提供给另一个流。一旦您可以确定消息所需的数据长度,就可以将第二个流切换为消息。您可以设置一个外部循环,其中检查可用字节并等待其值为&gt; 0开始下一条消息。还应注意,任何网络代码都应该在自己的线程上运行,以免阻塞UI线程。