我在NetworkStream
套接字服务器中使用SslStream
套接字,如下所示:
stream = new NetworkStream(socket, true);
sslStream = new SslStream(stream, false);
我的问题是,如果我拨打sslStream.Dispose()
时,SslStream
是否会处理/关闭其内部流及其套接字?
或者我是否需要使用sslStream.Close()
,stream.Close()
和socket.Close()
明确关闭所有三种资源?
答案 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()
即可关闭SslStream
, NetworkStream
及其套接字。