Проблема для обнаружения TcpClient отключен из-за потери сети - PullRequest
3 голосов
/ 17 февраля 2012

Я работаю над проектом асинхронного запроса TcpClient WPF.В котором я написал некоторый код, когда клиент отключается от сети из-за отключения сокета.Он работает нормально, и когда сокет удаляется / отключается также на стороне сервера, ни одно событие не запускается или исключение не принимается, чтобы отключить состояние клиента.Я видел об этой проблеме на многих сайтах, на каждом из которых люди говорили, что используют метод Socket.Poll, но в моем случае это не работает.SelectMode.SelectRead всегда возвращает true, когда клиент подключен или отключен, поэтому я не могу найти альтернативы.

Итак, я отправляю свой вопрос здесь, чтобы узнать, как найти, когда клиентский сокет отключен / сетевой доступ потерян в асинхронном режиме.Я пытался с помощью следующего кода, любой, как он не работает.

    void CheckSocketStatus()
    {
        try
        {
            while (true)
            {
                System.Threading.Thread.Sleep(1000);
                if(!mobjClient.Client.Poll(0,SelectMode.SelectWrite))
                {
                    break;
                }
            }
        }
        catch(SocketException soex)
        {

        }
    }

Надеюсь, кто-то может мне помочь.

1 Ответ

1 голос
/ 17 февраля 2012

Правильно, что это не может быть использовано для обнаружения определенных проблем с подключением, как в документации , которая гласит:

Этот метод не может обнаружить определенные виды проблем с подключением, такие какповрежден сетевой кабель или удаленный узел удаленно отключен.Вы должны попытаться отправить или получить данные, чтобы обнаружить ошибки такого рода.

Возможно, вам следует рассмотреть возможность не полагаться на постоянное соединение и вместо этого открывать / закрывать его по требованию.Тем не менее, если вам нужна какая-то информация о состоянии соединения, неудачный вывод заключается в том, что базовая архитектура не обеспечивает ее.Вам придется делать это путем периодического обмена пакетами и перехвата ошибок.

Это также то, что документация по свойству Connected в TcpClient предлагает:

Поскольку свойство Connected отражает только состояние соединения на момент последней операции, вы должны попытаться отправить или получить сообщение, чтобы определить текущее состояние.После сбоя отправки сообщения это свойство больше не возвращает true.Обратите внимание, что это поведение предусмотрено дизайном.Вы не можете надежно проверить состояние соединения, потому что во время между проверкой и отправкой / получением соединение могло быть потеряно.Ваш код должен предполагать, что сокет подключен, и корректно обрабатывать неудачные передачи.

...