My IsConnected всегда возвращает true - PullRequest
1 голос
/ 13 апреля 2009

Тест-кейсы:

  1. Перед началом соединения должно быть возвращено false
  2. Соединение закрыто другим концом возврата false
  3. Соединение закрыто клиентом return false
  4. Соединение существует, даже если нет доступных данных. Return true

    class MyConnection
    { 
        //Assume I have all initialization for _socket 
        public bool IsConnected()
        {
            return !(_socket.Poll(1, SelectMode.SelectRead)
                                        && _socket.Available == 0);
        }
        private Socket _socket;   
    
    * *} Тысяча двадцать-один
    class Test
    {
       static void Main(string[] args)
       { 
            MyConnection my = new  MyConnection()
            if(my.IsConnected())
               /*always return true even when I am not connected*/;    
       }
    }
    

Есть идеи, как это предотвратить?


Пока что ни один из ответов не был удовлетворительным ...

Можно сделать следующее:

   public bool IsConnected()
        {

            bool bConnected = false;
            bool bState = _socket.Poll(1, SelectMode.SelectRead);
            try
            {
                if (bState && (_socket.Available == 0))
                    bConnected = false;
                else
                    bConnected = true;
            }
            catch (SocketException)
            {
                //_socket.Available can throw an exception
                bConnected = false;
            }

            return bConnected;
        }

Ответы [ 3 ]

3 голосов
/ 13 апреля 2009

Я думаю, что ваш _socket.Poll() звонок обратный. Если опрос не удастся, это поможет методу оценить как истинное, а не ложное. Попробуйте это:

public bool IsConnected()
{
    return !(!_socket.Poll(1, SelectMode.SelectRead)
                                && _socket.Available == 0);

}

Я также не уверен, что это хорошая идея - сделать _socket.Available частью этой проверки. Согласно документации , возвращаемое значение 0 означает, что «в сетевом буфере нет данных в очереди». Это может быть очень легко даже для подключенного сокета.

1 голос
/ 13 апреля 2009

Я не уверен, что именно вы пытаетесь достичь, но, если вы пытаетесь сказать, была ли нарушена связь, этот пост может быть полезен:

Как я могу узнать, разорвано ли соединение в моем клиенте на основе сокетов?

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

0 голосов
/ 15 апреля 2009

Мне кажется, что вы не можете получить ту функциональность, которую ожидаете от класса Socket. Насколько я понимаю, класс Socket знает только о состоянии подключения на момент последней операции с сокетом.

Обратите внимание, что метод Poll имеет некоторые ограничения:

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

Это будет означать, что в случае неблаговидного разъединения было бы нормально, чтобы сокет продолжал сообщать об истине до истечения времени ожидания последующей операции сокета (что может объяснить несколько минутную задержку, которую вы испытали в предыдущем посте по этому вопросу. ).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...