2

多くの非同期読み取りを行うアプリケーションを扱っています。パフォーマンスを向上させるために、呼び出しがブロックされない限り、Readfromへの同期呼び出しを直接実行したいと思います。SslStream

それSslStream自体はDataAvailable、基になるものとは異なり、プロパティを提供しませんNetworkStream

それで、ラップされたネットワーク ストリームが読み取られていることがわかっている場合、 の呼び出しがブロックを引き起こさないことがtrue保証DataAvailableされるでしょうか?SslStream

このような:

public void Read(NetworkStream netStream, SslStream sslStream)
{
    // given that netStream is the inner stream of sslStream
    if (netStream.DataAvailable)
    {
        // Will not block
        sslStream.Read(...);
    }
    else
    {
        // Would block
        sslStream.Read(...);
    }
}

SslStreamすでに認証されており、すぐに使用できます。暗号化/復号化以外に追加のオーバーヘッドがあるかどうかはわかりません。SslStream暗号化された 1 バイトを読み取るために、基になるストリームから複数のバイトを読み取る必要がある場合、答えは依存していると思います。

4

2 に答える 2

2

いいえ、それを保証するものではありません。なぜなら、次のレイヤーに SSL レコードがあり、まだ完全な SSL レコードを受け取っていない可能性があるからです。整合性のために MAC を確認してください。

しかし、もっと重要なことに、私は戦略全体に疑問を投げかけています。通常のコードで必要に応じて読み取りを発行するだけです。各状況でどのモードが最適に機能するかを推測しようとしないでください。SSL オーバーヘッドはおそらく同期/非同期の違いを圧倒し、ネットワーク帯域幅の制限は両方を圧倒します。

于 2012-08-14T23:06:55.003 に答える
1

RC4 または別のストリーム暗号を使用するエンドポイントは、一度に 1 バイトずつ復号化できる可能性が高くなりますが、保証はありません。DES またはその他のブロック暗号用に構成されたエンドポイントは、完全なブロックが利用可能になるまで待機します。

覗き見可能な中間バッファリング ストリームを使用して厄介なことを行い、ブロッキング読み取りを行う前に適切なブロック サイズを確保しようとすることもできますが、これは厄介なことです。

絶対にブロックできない場合は、BeginRead と完了デリゲートを使用します。

于 2012-08-14T16:52:21.107 に答える