【问题标题】:c# SslStream.Read Loop problemc# SslStream.Read 循环问题
【发布时间】:2011-06-01 21:13:45
【问题描述】:

我一直在通过创建一个应用程序来学习 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);

【问题讨论】:

    标签: c# .net networkstream sslstream


    【解决方案1】:

    如果您使用.Net 3.5 或更高版本,我强烈建议您查看Windows Communication Foundation (wcf)。它可以满足您通过网络尝试执行的任何操作。

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

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多