3

Zlib両方の方法(クライアントからサーバーへ、サーバーからクライアントへ)のストリームであるTCP経由のネットワークストリームがあります。

についてZlibは、最新のものを使用していIonic.Zlib.dllます。

送受信される最初の数パケットについては正常に動作しますが、3 番目のパケットを受信すると、誤動作が始まります。

ZlibStreamパケットが相手側で繰り返されるまで、ブロックに対するすべての読み取り操作。

例えば:

// Where reader is a BinaryReader on the ZlibStream on the NetworkStream
int a = reader.ReadInt32(); // blocks until initial packet that is 12 bytes is received
int b = reader.ReadInt32(); // blocks until the packet is repeated
int c = reader.ReadInt32(); // blocks until the packet is repeated again

このコードの後、パケットは実際には 3 回送信され、1 回だけ受信されています。

なぜそこでブロックされているのですか?ブロックせずに期待どおりに続行するにはどうすればよいですか?

Zlib でのフラッシュはそれと関係がありますか? (ストリームはすべてのパケットの後にフラッシュされます。)

4

2 に答える 2

2

Zlib は、他の圧縮アルゴリズムと同様に、データのブロックを操作します。ソース ストリームから一部のデータをバッファリングし、それを圧縮しようとします。

バッファサイズよりも小さい ZlibStream データを入れると、実際には ZlibStream からすぐには何も出力されません。バッファがいっぱいになるまで、データはそこに置かれます。そのデータを圧縮するには、元のストリーム、さらにはおそらく圧縮されたストリームをフラッシュするだけでは十分ではありません。

serve が ZlibStream を閉じると、すべての readInts が正しいデータを受け取るはずです。

サーバーからリアルタイムでパケットを受信したい場合は、最初にパケットを完全に圧縮してから、ネットワーク ストリーム経由で送信してみてください。

于 2013-08-08T07:24:09.987 に答える