Располагает ли SslStream.Dispose своим внутренним потоком - PullRequest
0 голосов
/ 30 марта 2012

Я использую NetworkStream с сокетами на сервере сокетов SslStream следующим образом:

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

Мой вопрос: если при вызове sslStream.Dispose(), SslStream удалит / закроет свой внутренний поток и сокет тоже?

Или мне нужно явно закрыть все три ресурса с помощью sslStream.Close(), stream.Close() и socket.Close()?

1 Ответ

4 голосов
/ 13 июля 2012

Если возможно, вы должны использовать конструкцию C # using, чтобы утилизировать поток «автоматически» после использования:

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

Однако, если вы хотите сохранить SslStream для дальнейшего использования, вам придется утилизировать его вручную.

Удаление потока, как правило, также закрывает поток, метод Close(), кажется, используется в основном для полноты. Вы можете скачать исходный код .NET (или использовать декомпилятор) и проверить SslStream.cs и его базовый класс AuthenticatedStream.cs, чтобы увидеть точное поведение.

Чтобы ответить на остальную часть вашего вопроса - SslStream хорошо документирован на сайте Microsoft MSDN , на котором показан один из конструкторов SslStream принимает два параметра (также показано на вашем примере). Первый параметр - это внутренний поток, который в вашем примере является объектом NetworkStream. Вторым является логическое значение, называемое leaveInnerStreamOpen. В вашем примере вы передаете false.

Именно это второе значение определяет поведение, о котором вы спрашиваете: если вы передадите true, , внутренний поток останется открытым , когда вы закроете / опустите SslStream (поток также будет очищен ). Если вы передадите false, то внутренний поток тоже будет закрыт .

Аналогично для NetworkStream его конструктор также принимает логическое значение ownsSocket. Если для этого параметра установлено значение true (как в вашем примере), то утилизация / закрытие NetworkStream также закроет сокет , в противном случае он останется открытым.

Таким образом, в качестве примера кода вы должны вызывать sslStream.Dispose() и stream.Dispose() (сокет автоматически закрывается).

Однако, если вы измените второй параметр в конструкторе SslStream на true в вашем примере кода, вы можете просто вызвать sslStream.Dispose(), чтобы закрыть SslStream, NetworkStream и его сокет .

...