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

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

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

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

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

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

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

textual
Листинг программы
        public NetworkStream GetStream() {
            if(Logging.On)Logging.Enter(Logging.Sockets, this, "GetStream", "");
            if (m_CleanedUp){
                throw new ObjectDisposedException(this.GetType().FullName);
            }
            if (!Client.Connected) {
                throw new InvalidOperationException(SR.GetString(SR.net_notconnected));
            }
            if (m_DataStream==null) {
                m_DataStream = new NetworkStream(Client, true);
            }
            if(Logging.On)Logging.Exit(Logging.Sockets, this, "GetStream", m_DataStream);
            return m_DataStream;
        }

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


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

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

5   голосов , оценка 4 из 5
Похожие ответы