0

私はアプリを作成して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);
4

1 に答える 1

0

.Net 3.5以降を使用している場合は、Windows Communication Foundation(wcf)を調べることを強くお勧めします。それは単にあなたがネットワーク上でやろうとしていることなら何でもします。

一方、これを純粋に教育目的で行っている場合。このリンクを見てください。最善の策は、ストリームから少しずつ読み取り、そのデータを別のストリームにフィードすることです。メッセージに必要なデータの長さを特定できたら、2番目のストリームをメッセージに切り取ることができます。使用可能なバイトがチェックされている外部ループを設定し、その値が0より大きいまで待って次のメッセージを開始できます。また、UIスレッドをブロックしないように、ネットワークコードは独自のスレッドで実行する必要があることにも注意してください。

于 2011-06-01T21:53:40.143 に答える