Jak wykryć rozłączenie gniazda w C #

Pracuję nad relacją klient / serwer, która ma przesuwać dane tam iz powrotem przez nieokreślony czas.

Problem, który próbuję pokonać, jest po stronie klienta, ponieważ nie mogę znaleźć sposobu na wykrycie odłączenia.

Podjąłem kilka kroków w rozwiązaniach innych ludzi, począwszy od wyłapywania wyjątków IO, a skończywszy na odpytywaniu gniazda we wszystkich trzech SelectModes. Próbowałem również użyć kombinacji ankiety, zaznaczając pole „Dostępne” gniazda.

// 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
    }
}

Po stronie serwera próba zapisania „pustego” znaku (0) na kliencie wymusza wyjątek IO, a serwer może wykryć, że klient się rozłączył (dość łatwy koncert).

Po stronie klienta ta sama operacja nie daje wyjątku.

// 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;
    }
}

Problem, który, jak sądzę, mam w wykrywaniu rozłączenia przez ankietę, polega na tym, że dość łatwo mogę spotkać się z fałszem na SelectRead, jeśli mój serwer nie napisał jeszcze niczego klientowi od ostatniego sprawdzenia ... Nie wiem, co tu robić, ścigałem każdą opcję, aby to wykrycie mogłem znaleźć i nic nie było dla mnie w 100%, a ostatecznie moim celem jest wykrycie awarii serwera (lub połączenia), poinformowanie klienta, poczekaj na ponowne połączenie itp. Jestem pewien, że możesz sobie wyobrazić, że jest to integralny element.

Doceń wszelkie sugestie. Dzięki z góry.

EDYCJA: Każdy, kto przegląda to pytanie, powinien zanotować odpowiedź poniżej i moje OSTATECZNE komentarze na jego temat. Wyjaśniłem, jak przezwyciężyłem ten problem, ale jeszcze nie stworzyłem postu „Q&A”.