Как проверить что TCP клиент отключился?

Запускаются клиент и сервер. Клиент цепляется к серверу, далее оба начинают слушать стрим на входящие сообщения.

Код прослушки:
private void Listen()
        {
            NetworkStream stream = _Client.GetStream();
            var bf = new BinaryFormatter();
            
            while (Listening)
            {                
                if (stream.CanRead)
                {
                    try
                    {
                        if (_Client.Connected)
                        {
                            object o = bf.Deserialize(stream);
                            var msg = (Message)o;
                            if (_Answers.ContainsKey(msg.Guid))
                            {
                                _Answers[msg.Guid] = msg.Data;
                                continue;
                            }
                            if (_Messages.ContainsKey(msg.Guid))
                            {
                                new Task((_Messages[msg.Guid] as Action<object>), msg).Start();
                                continue;
                            }
                            Console.WriteLine("Сообщение не ожидалось");
                        }
                        else
                        {
                            Console.WriteLine("Отключено");
                            _Client.Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(string.Format("Неизвестное сообщение. {0}", ex.Message));
                        
                    }
                    
                }
                System.Threading.Thread.Sleep(100);
            }
        }


Если я вырубаю сервер, то клиент выводит в консоль "Отключено" и все норм.

Проблема в том, что когда клиент завершает работу (закрываю форму или гашу процесс - не важно), сервер начинает беситься и спамить сообщения вот отсюда Console.WriteLine(string.Format("Неизвестное сообщение. {0}", ex.Message));
Их текст "Неизвестное сообщение. Конец потока обнаружен до завершения разбора".
Почему то _Client.Connected остается true, а стрим начинает получать какие-то сообщения, которые не может десериализовать, потому что они неполные.
  • Вопрос задан
  • 2027 просмотров
Пригласить эксперта
Ответы на вопрос 1
@host13
В момент закрытия сокета на стороне клиента сервер получает строку нулевой длины. Проверяйте длину принятого сообщения: если 0 - значит клиент спекся.
Гуглить connection gracefully closed, connection reset by peer и ловить соответствующие исключения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы