Это конкретный вопрос о том, что происходит в фоновой связи NetworkStream, потребляющей необработанные данные через TCP. Соединение TcpClient взаимодействует напрямую с аппаратным устройством в сети. Каждый раз так часто, в случайные моменты времени, NetworkStream появляется с икотой и может быть лучше всего описан при наблюдении в режиме отладки. У меня есть тайм-аут чтения, установленный в потоке, и когда все работает так, как ожидалось, при переходе через Stream.Read
, он будет сидеть там и ждать длины таймаута для входящих данных. Когда нет, поступает только небольшая часть данных, TcpClient по-прежнему отображается как открытый и подключенный, но Stream.Read
больше не ждет периода ожидания для входящих данных. Он сразу переходит к следующей строке, никакие данные не получены явно, и никакие данные никогда не появятся до тех пор, пока все не будет удалено, и новое соединение будет восстановлено.TCP Socket/NetworkStream неожиданно сбой
Вопрос в этом конкретном сценарии, какое состояние является NetworkStream в этой точке, что его вызывает, и почему соединение TcpClient все еще находится в кажущемся открытом и действительном состоянии? Что происходит в фоновом режиме? Нет ошибок, которые были сброшены и захвачены, является ли поток бесшумным сбоем в фоновом режиме? В чем разница между состояниями TcpClient и NetworkStream?
private TcpClient Client;
private NetworkStream Stream;
Client = new TcpClient();
var result = Client.BeginConnect(IPAddress, Port, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2));
Client.EndConnect(result);
Stream = Client.GetStream();
try
{
while (Client.Connected)
{
bool flag = true;
StringBuilder sb = new StringBuilder();
while (!IsCompleteRecord(sb.ToString()) && Client.Connected)
{
string response = "";
byte[] data = new byte[512];
Stream.ReadTimeout = 60000;
try
{
int recv = Stream.Read(data, 0, data.Length);
response = Encoding.ASCII.GetString(data, 0, recv);
}
catch (Exception ex)
{
}
sb.Append(response);
}
string rec = sb.ToString();
// send off data
Stream.Flush();
}
}
catch (Exception ex)
{
}
Спасибо за вклад, Филипп! Существует много логики, которые я извлек из фрагмента кода для ясности, чтобы выделить, где возникла проблема. –
Я подозревал, что вы сказали, но я должен уточнить. Закрытие удаленного хоста не должно происходить; это неожиданно. В этом случае удаленный хост отправляет часть передачи и неожиданно закрывается. Я ищу идентификатор, который приходил бы через провод, чтобы определить, в каком состоянии находится удаленный хост во время сбоя.Есть ли дополнительная команда или пакет низкого уровня, который я мог бы идентифицировать во время закрытия, или определенное состояние потока, которое я ищу на стороне .net? Мне нужно собрать как можно больше информации для производителя. –
Я использую wirehark, чтобы проверить, что происходит на проводе. Когда соединение TCP закрывается, происходит четырехстороннее рукопожатие. Партнер должен инициировать его, отправив FIN. Ваша сторона TCP будет поддерживать его, а когда вы закроете сокет, вы также отправите FIN, чтобы партнер мог. –