.NET 4.x TcpClient, Sockets и бесконечный NetworkStream - C#

Узнай цену своей работы

Формулировка задачи:

У меня стоит задача реализовать общение с устройством, причем если будет разрыв соединения, то необходимо будет провести некий обмен командами(2-х сторонее рукопожатие - выдача имени клиенту). В коде я использую:
Листинг программы
  1. _tcpClient = new TcpClient("127.0.0.1", 12345); // статичный объект, гдето в коде
  2. // поток для отправки/принятия данных на момент выполнения операции
  3. using(var stream = _tcpClient.GetStream()) {
  4. //Здесь соотвественно выполняю stream.Read или stream.Write
  5. }
покопавшись в http://referencesource.microsoft.com, увидел, что при вызове GetStream создается NetworkStream с привязкой к сокету, а это значит что при вызове stream.Dispose() - который автоматом вызовется в блоке using, у меня

произойдет отсоединение от сокета

. Это значит, что мне придется вновь установить соединение через
Листинг программы
  1. _tcpClient = new TcpClient("127.0.0.1", 12345);
и снова можно работать. Вызывает ли stream.Dispose() реальный разрыв соединения с сокетом, то есть на другой стороне поймут что я отсоединился или так и будут в неведении? Мне необходимо минимизировать количество подсоединений, чтобы собственно избавится от 2-х сторонних рукопожатий при отсылке каждой команды. Я подумал сделать статичный поток и вызывать Dispose() руками при каких-нибудь критических фейлах программы или при завершении. Это нормальная практика ? Просто мне не нравится идея оставлять висящий поток неизвестно где. Или же все о чем я написал надумано и реального разрыва соединения не происходит и при вызове
Листинг программы
  1. _tcpClient = new TcpClient("127.0.0.1", 12345);
во второй, третий ... разы просто соединение становится активным?

Решение задачи: «.NET 4.x TcpClient, Sockets и бесконечный NetworkStream»

textual
Листинг программы
  1.         public NetworkStream GetStream() {
  2.             if(Logging.On)Logging.Enter(Logging.Sockets, this, "GetStream", "");
  3.             if (m_CleanedUp){
  4.                 throw new ObjectDisposedException(this.GetType().FullName);
  5.             }
  6.             if (!Client.Connected) {
  7.                 throw new InvalidOperationException(SR.GetString(SR.net_notconnected));
  8.             }
  9.             if (m_DataStream==null) {
  10.                 m_DataStream = new NetworkStream(Client, true);
  11.             }
  12.             if(Logging.On)Logging.Exit(Logging.Sockets, this, "GetStream", m_DataStream);
  13.             return m_DataStream;
  14.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы