C # - Чтобы закрыть NetworkStream, вызовите stream.Close или socket.Shutdown? - PullRequest
9 голосов
/ 19 февраля 2011

Мне было интересно, знает ли кто-нибудь лучший способ избавиться от класса, который использует объект Socket и объект NetworkStream?У рассматриваемого класса есть экземпляр NetworkStream и экземпляр Socket, который используется для создания NetworkStream.

this.socket = new Socket(
                           AddressFamily.InterNetwork,
                           SocketType.Stream,
                           ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 65536,
                            SendBufferSize = 150
                        };

this.socket.Connect(
                        new IPEndPoint(                                                                   
                              IPAddress.Parse(
                                          Properties.Settings.Default.MpsServer2),
                                          Properties.Settings.Default.MpsPort2));

this.stream = new NetworkStream(
                         this.socket, true);

В моем методе Dispose я должен сделать это?

this.stream.Close();
this.socket.Shutdown(SocketShutdown.Both);
this.socket.Close();

все это необходимо или это перебор?

Ответы [ 3 ]

2 голосов
/ 19 февраля 2011

Socket не располагает ассоциированным NetworkStream.Я загорелся отражатель тоже быть уверенным.(инструмент для анализа .NET-библиотек и .NET-библиотек. Отличный инструмент. Вы должны до конца месяца загрузить бесплатную версию, прежде чем она станет полностью коммерческой.)* документация MDSN и отражатель потока закроет сокет, но только если он владеет сокетом.Вы можете установить это как второй параметр в перегруженном конструкторе.

Вы должны вызывать Shutdown в любом случае, потому что если сбрасывает данные .Если вы этого не сделаете, вы можете потерять данные.

1 голос
/ 19 февраля 2011

Согласно документации в MSDN, вызов stream.Close () «Закрывает текущий поток и освобождает любые ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком.», Что говорит мне о том, что stream.Close () также располагает сокетом. Вам все равно придется вызывать socket.Shutdown ().

В любом случае, ИМХО, самый безопасный способ - использовать «использование», он удерживает вас на безопасном сайте:)

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 65536,
                            SendBufferSize = 150
                        };) {
  socket.Connect(
    new IPEndPoint(
      IPAddress.Parse(
        Properties.Settings.Default.MpsServer2), Properties.Settings.Default.MpsPort2));

  using (var stream = new NetworkStream(socket, true) {
    // do something with the stream here
  }

  socket.Shutdown(SocketShutdown.Both);
}
1 голос
/ 19 февраля 2011

И Socket, и Stream Реализуйте IDisposable, чтобы вы могли просто вызывать .Dispose() для каждого объекта. Метод Dispose должен обрабатывать закрытие и другие действия, необходимые для удаления.

this.stream.Dispose(); 
this.socket.Dispose(); 

Например, это дизассемблированный метод Dispose из класса потока:

public void Dispose()
{
    this.Close();
}
...