SslStream.Dispose是否处理其内部流

时间:2012-03-29 23:17:54

标签: c# stream dispose sslstream

我在NetworkStream套接字服务器中使用SslStream套接字,如下所示:

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

我的问题是,如果我拨打sslStream.Dispose()时,SslStream是否会处理/关闭其内部流及其套接字?

或者我是否需要使用sslStream.Close()stream.Close()socket.Close()明确关闭所有三种资源?

1 个答案:

答案 0 :(得分:4)

如果可能,您应该使用C#的using构造在使用后自动处理流:

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

但是,如果您想保留SslStream供以后使用,则必须手动处理。

处理流通常也会关闭流,Close()方法似乎主要是为了完整性。您可以下载.NET源代码(或使用反编译器),并检查SslStream.cs及其基类AuthenticatedStream.cs以查看确切的行为。

要回答您的其余问题 - SslStream已在Microsoft MSDN网站上详细记录,其中显示one of SslStream's constructors有两个参数(也在您的示例中显示)。第一个参数是内部流 - 在您的示例中是NetworkStream对象。第二个是一个名为leaveInnerStreamOpen的布尔值。在您的示例中,您传递了false

这是确定您要询问的行为的第二个值:如果您通过true当您关闭/获取SslStream时,内部流将保持打开状态也被冲洗了)。如果您传递false,那么内部流也将关闭

对于NetworkStream,其构造函数也采用布尔值ownsSocket。如果将其设置为true(如示例所示),则处理/关闭NetworkStream 也将关闭其套接字,否则它将保持打开状态。

因此,正如您的示例代码所示,您必须同时调用sslStream.Dispose() stream.Dispose()(套接字会自动关闭)。

但是,如果您在示例代码中将SslStream的构造函数中的第二个参数更改为true,则只需调用sslStream.Dispose()即可关闭SslStreamNetworkStream及其套接字。