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