1

NetworkStream次のように、ソケットサーバーでソケットを使用しSslStreamます。

stream = new NetworkStream(socket, true); 
sslStream = new SslStream(stream, false);

私の質問は、私が呼び出すとsslStream.Dispose()SslStreamその内部ストリームとそのソケットも破棄/閉じますか?

sslStream.Close()または、stream.Close()とで3 つのリソースすべてを明示的に閉じる必要がありsocket.Close()ますか?

4

1 に答える 1

4

可能であれば、C# のusingコンストラクトを使用して、使用後にストリームを「自動的に」破棄する必要があります。

using (var sslStream = new SslStream(stream, false))
{
    // read from stream here...
}

ただし、後で使用するために SslStream を保持する場合は、手動で破棄する必要があります。

通常、ストリームを破棄すると、ストリームも閉じられます。このClose()メソッドは、主に完全性のために存在するようです。.NET ソース コードをダウンロード (または逆コンパイラを使用) し、SslStream.csとその基本クラスAuthenticatedStream.csを調べて正確な動作を確認できます。

あなたの質問の残りの部分に答えるために -のコンストラクターの1つが2つのパラメーターを取ることを示すMicrosoftのMSDNサイトでSslStream十分に文書化されています(あなたの例でも示されています)。最初のパラメータは内部ストリームです - あなたの例ではオブジェクトです。2 番目は、 というブール値です。あなたの例では、 を渡します。SslStreamNetworkStreamleaveInnerStreamOpenfalse

質問している動作を決定するのは、この 2 番目のtrueです。パスすると、内側のストリームも閉じられますfalse

の場合と同様にNetworkStream、そのコンストラクターもブール値を取りますownsSocket。これがtrue(あなたの例のように)に設定されている場合、 NetworkStreamを破棄/閉じると socket も閉じられます。それ以外の場合は開いたままになります。

sslStream.Dispose() したがって、サンプル コードの状態では、 と の両方を 呼び出す必要がありますstream.Dispose()(ソケットは自動的に閉じられます)。

SslStreamただし、のコンストラクターの2 番目のパラメーターをサンプル コードで に変更すると、 、、およびそのソケットを閉じるためにtrue呼び出すことができます。sslStream.Dispose()SslStreamNetworkStream

于 2012-07-13T06:18:54.700 に答える