1

NetworkStreamSslStream套接字服务器中使用套接字,如下所示:

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

我的问题是,如果当我调用 时sslStream.Dispose(),也会SslStream释放/关闭其内部流及其套接字吗?

还是我需要用sslStream.Close(),stream.Close()和明确关闭所有三个资源socket.Close()

4

1 回答 1

4

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

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

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

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

要回答您的其余问题 - SslStreamMicrosoft 的MSDN站点上有详细记录,其中显示的构造函数之一SslStream采用两个参数(您的示例也显示了)。第一个参数是内部流 - 在您的示例中是NetworkStream对象。第二个是一个布尔值,称为leaveInnerStreamOpen. 在您的示例中,您通过false.

正是这第二个值决定了您要询问的行为:如果您通过true,当您关闭/处理 SslStream 时,内部流将保持打开状态(该流也将被刷新)。如果你通过了false,那么内流也会被关闭

类似地NetworkStream,它的构造函数也接受一个布尔值ownsSocket。如果将其设置为true(如您的示例中所示),则处置/关闭 NetworkStream也将关闭其 socket,否则它将保持打开状态。

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

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

于 2012-07-13T06:18:54.700 回答