1

両端でTcpClientのNetWorkStreamの周りにCryptoStreamを使用してクライアント/サーバーをセットアップしています。NetworkStream から直接読み取ると、通信は双方向でうまく機能しますが、CryptoStream を使用すると、利用可能なデータの単一ブロックを読み取ることができません。私はCryptoStreamを閉じて、FlushLastBlockがサーバーから呼び出されるようにしています。実際、16バイトの唯一のブロック(AES暗号化)がクライアント側に表示されます。では、利用可能な完全なデータ ブロックがあるのに、CryptoStream.Read() ブロックがデータを待機するのはなぜでしょうか?

PS追加のブロックを送信すると、リーダーが最初のブロックを読み取ることができることを確認しました。これは単なるバグですか、それとも仕様ですか?

4

1 に答える 1

0

送信側の CryptoStream で FlushFinalBlock() を呼び出しましたか?

using (var stream = new MemoryStream())
{
    using (var cs = new CryptoStream(stream, your_encryptor, CryptoStreamMode.Write))
    {
        your_formatter.Serialize(cs, your_graph);
        cs.FlushFinalBlock();
        your_socket.Send(stream.GetBuffer(), 0, (int)stream.Length);
    }
}
于 2013-12-19T01:31:32.263 に答える