.NET 4.x TcpClient, Sockets и бесконечный NetworkStream - C#
Формулировка задачи:
У меня стоит задача реализовать общение с устройством, причем если будет разрыв соединения, то необходимо будет провести некий обмен командами(2-х сторонее рукопожатие - выдача имени клиенту). В коде я использую:
покопавшись в http://referencesource.microsoft.com, увидел, что при вызове GetStream создается NetworkStream с привязкой к сокету, а это значит что при вызове stream.Dispose() - который автоматом вызовется в блоке using, у меня и снова можно работать.
Вызывает ли stream.Dispose() реальный разрыв соединения с сокетом, то есть на другой стороне поймут что я отсоединился или так и будут в неведении?
Мне необходимо минимизировать количество подсоединений, чтобы собственно избавится от 2-х сторонних рукопожатий при отсылке каждой команды. Я подумал сделать статичный поток и вызывать Dispose() руками при каких-нибудь критических фейлах программы или при завершении.
Это нормальная практика ? Просто мне не нравится идея оставлять висящий поток неизвестно где. Или же все о чем я написал надумано и реального разрыва соединения не происходит и при вызове
во второй, третий ... разы просто соединение становится активным?
_tcpClient = new TcpClient("127.0.0.1", 12345); // статичный объект, гдето в коде // поток для отправки/принятия данных на момент выполнения операции using(var stream = _tcpClient.GetStream()) { //Здесь соотвественно выполняю stream.Read или stream.Write }
произойдет отсоединение от сокета
. Это значит, что мне придется вновь установить соединение через_tcpClient = new TcpClient("127.0.0.1", 12345);
_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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д