2

Jon Skeet がその他のutils libの一部として書いたEndianBinaryReaderandを使用しようとしています。それは私がそれを作った2つの用途に最適です.EndianBinaryWriter

ネットワーク ストリーム ( TCPClient) からの最初の読み取りでは、入ってくるデータをループで読み取ります。単一のデータを作成してEndianBinaryReader、アプリケーションのシャットダウン時に破棄することができます。EndianBinaryReaderを渡すことでを構築TCPClient.GetStreamします。

UdpClient から読み取るときに同じことを実行しようとしていますが、接続が少ないため、これにはストリームがありません。だから私はそのようにデータを取得します

byte[] data = udpClientSnapShot.Receive(ref endpoint);

このデータをメモリストリームに入れることができます

var memoryStream = new MemoryStream(data);

次に、EndianBinaryReader

var endianbinaryReader = new EndianBinaryReader(
    new BigEndianBitConverter(), memoryStream,Encoding.ASCII);

ただし、これは、読み取りを行うたびに新しいエンディアン リーダーを作成する必要があることを意味します。udpクライアントからのデータで入力ストリームを更新し続けることができる単一のストリームを作成できる方法はありますか?

4

2 に答える 2

1

最善のオプションは、カスタム機能を提供するために.NETStreamクラスをオーバーライドすることです。このクラスは、カスタム動作でオーバーライドできるように設計されています。

メンバー数の関係で気が遠くなるかもしれませんが、見た目よりも簡単です。「CanWrite」などのブールプロパティがいくつかあります。それらをオーバーライドして、リーダーに必要な機能を除いてすべて「false」を返すようにします(おそらく、CanReadだけがtrueである必要があります)。

次に、 Streamのヘルプで「派生クラスでオーバーライドされた場合」というフレーズで始まるすべてのメソッドをオーバーライドし、サポートされていないメソッドが(デフォルトの「NotImplementedException」ではなく)「UnsupportedException」を返すようにします。

おそらくリンクされたバッファのリストを使用して、バッファリングされたUDPパケットからデータを返すReadメソッドを実装し、メモリフットプリントが無制限に拡大しないように、使用済みバッファを「null」に設定します。

于 2010-01-22T16:42:11.027 に答える
1

バッファかどうか思い出せませんEndianBinaryReader- 単一のバッファを上書きできますMemoryStreamか? しかし、正直に言うと、ここでは余分なオブジェクトによるオーバーヘッドはほとんどありません。パケットの大きさは?(それを に入れると、MemoryStreamが複製されますbyte[])。

機能する最も単純なものを使用して、実際の問題があるかどうかを確認したくなるでしょう。おそらく、私行う変更の 1 つは導入することですusing(それらは であるためIDisposable):

using(var memoryStream = new MemoryStream(data))
using(var endianbinaryReader = ..blah..) {
    // use it
}
于 2010-01-22T16:35:36.923 に答える