.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;
}