По характеру TCP-соединения - единственный надежный способ обнаружить его - это что-то записать в него.Если вы просто читаете (ожидаете получения данных) - вы можете делать это в течение очень долгого времени, в то время как другая сторона давно мертва.Это происходит, если эта другая сторона не закрыла соединение изящно (что включает обмен некоторыми TCP-пакетами).
Протокол веб-сокета определяет специальный кадр Ping и соответствующий кадр Pong, который следует использовать, чтобы избежать ситуации, описанной ввопрос.Время от времени вы должны отправлять Ping
фрейм и ждать (в течение определенного времени ожидания), пока сервер ответит Pong
фреймом.Если он не ответил в течение заданного времени ожидания - предположим, что соединение разорвано, и переподключите.
Насколько я знаю - используемая вами библиотека не отправляет запросы ping от вашего имени автоматически.Тем не менее, это позволяет вам сделать это с помощью метода Ping
.
Вам необходимо настроить время ожидания с помощью
ws.WaitTime = TimeSpan.FromSeconds(5);
И затем время от времени (например, когда вы этого не делали).получать любые новые сообщения за последние X секунд), выполните:
bool isAlive = ws.Ping();
Существует также логическое свойство, которое делает то же самое:
bool isAlive = ws.IsAlive;
Это блокирующий вызов (оба из вышеперечисленных).Он вернет true, если сервер ответил с Pong
в течение интервала ws.WaitTime
, и false в противном случае.Тогда вы можете действовать соответственно.