Как обнаружить отключение сокета в C#

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

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

Я сделал пару проходов по решениям других людей, начиная от простого перехвата исключений ввода-вывода и заканчивая опросом сокета на всех трех режимах SelectModes. Я также пробовал использовать комбинацию опроса с проверкой поля «Доступно» сокета.

// Something like this
Boolean IsConnected()
{
    try
    {
        bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead);
        bool part2 = (this.Connection.Client.Available == 0);

        if (part1 & part2)
        {
            // Never Occurs
            //connection is closed
            return false;
        }
        return true;
    }
    catch( IOException e )
    {
        // Never Occurs Either
    }
}

На стороне сервера попытка записать «пустой» символ (\0 )клиенту вызывает исключение ввода-вывода, и сервер может обнаружить, что клиент отключился (довольно легко гиг ).

На стороне клиента та же операция не дает никаких исключений.

// Something like this
Boolean IsConnected( )
{
    try
    {

        this.WriteHandle.WriteLine("\0");
        this.WriteHandle.Flush();
        return true;
    }
    catch( IOException e )
    {
        // Never occurs
        this.OnClosed("Yo socket sux");
        return false;
    }
}

Проблема, с которой я столкнулся при обнаружении отключения через опрос, заключается в том, что я довольно легко могу столкнуться с ложным значением в SelectRead, если мой сервер еще ничего не отправил клиенту с момента последней проверки... Не Я знаю, что здесь делать, я перепробовал все варианты обнаружения, которые смог найти, и ничего не было для меня на 100%, и, в конечном счете, моя цель здесь — обнаружить сбой сервера (или соединения ), сообщить клиенту, дождаться переподключения и т. д. Так что я уверен, вы можете себе представить, что это неотъемлемая часть.

Оцените чьи-либо предложения. Спасибо заранее.

РЕДАКТИРОВАТЬ :Любой, кто просматривает этот вопрос, должен отметить ответ ниже и мои ПОСЛЕДНИЕ комментарии к нему. Я подробно рассказал, как я преодолел эту проблему, но еще не написал пост в стиле «Вопросы и ответы».

9
задан DigitalJedi805 5 November 2013 в 18:43
поделиться