【问题标题】:Does SslStream.Dispose dispose its inner streamSslStream.Dispose 是否处置其内部流
【发布时间】:2012-04-13 15:59:40
【问题描述】:

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

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

我的问题是,如果当我调用sslStream.Dispose() 时,SslStream 是否也会处理/关闭它的内部流和它的套接字?

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

【问题讨论】:

    标签: c# stream dispose sslstream


    【解决方案1】:

    如果可能,您应该使用 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 及其套接字.

    【讨论】:

    • ssl 构造函数 true 表示保持内部流打开,这意味着即使 sslstream 关​​闭,内部流仍保持打开状态。我认为 sslstream 构造函数应该具有 false 才能关闭内部流。谢谢
    • leaveInnerStreamOpen 的默认值是多少?
    • @daisy 实际上没有“默认”,因为调用者必须决定将什么传递给构造函数(取决于底层流的使用方式)。如果您只想使用SslStream 并且不关心“保持内部流打开”行为,则使用不带此参数的其他构造函数,例如:new SslStream(stream)。然后,框架将调用另一个“默认”值leaveInnerStreamOpen=false 的构造函数。这就像将您创建的内部流交给 SslStream 对象并说“您现在负责这个流,而不是我”。
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多