0

質問: ストリームからすべてのデータを取得する方法を知りたいです。

Asynchronous Client Socket のBeginSendメソッドからBeginReceiveクライアント側のメソッドにデータを送信しています。現在の目標は、ストリームを介して渡されたすべてのバイトを取得することです。

StateObjectのバッファ フィールド タイプを含むクラスを作成しました。このクラスbyte[]は固定長です (現在は 2048 に設定されています)。

では、取得したバイトをこのフィールドに渡すにはどうすればよいでしょうか? データは一度にすべてではなく、バラバラになっていることに注意してください。

サーバーから送信されたすべてのバイトを元に戻す必要があります。

Array.Copy()orメソッドを使用できますBuffer.BlockCopyか?

ポイントは、複数の条件を考慮する必要があることです。

  • buffer[2048] のすべてのインデックスが 0 に設定されていると仮定します

  • 最初のコピーでは、開始インデックスは0になります(その後、ストリームから取得したバイトを追加します)

  • 次のすべてのコピーでは、開始インデックスは配列の最初のゼロでなければなりません (つまり、配列にコピーされた以前のすべてのバイトの合計 - 1)。

それを達成する方法は?

4

1 に答える 1

0

ReadCallbackが起動されるたびに、バッファに0バイトを超え(そうでない場合は接続が切断されます)、このデータチャンクで受信された実際のバイト数があります。すべての新しいデータチャンクは、バッファのインデックス0から始まります。すべてのデータを受信するまで、すべての読み取りコールバックでandthanを使用var message = new MemoryStream()します。message.Write(buffer,0, bytes_received)これが最速の方法になります。

于 2012-10-25T20:14:37.840 に答える