Как обнаружить разъединение сокета в 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% для меня, и в конечном итоге моя цель здесь состоит в том, чтобы обнаружить сбой сервера (или соединения), сообщить клиенту, ждать повторного подключения и т. д. Так что я уверен, что вы можете себе представить, что это неотъемлемая часть.

Цените любые предложения. Спасибо заранее

EDIT: Anyone viewing this question should note the answer below, and my FINAL Comments on it. I've elaborated on how I overcame this problem, but have yet to make a 'Q&A' style post.

Ответы на вопрос(1)

Ваш ответ на вопрос