Wie zu erkennen, eine Socket-Verbindung Trennen in C#

Arbeite ich an einer client/server-Beziehung, die bedeutete, zu schieben Daten hin und her für unbestimmte Zeit.

Das problem, das ich versuche zu überwinden ist, auf der client-Seite, ist, dass ich das nicht gelingen einen Weg zu finden, zu erkennen ein trennen.

Ich habe schon ein paar Pässe mit anderen Völkern Lösungen, angefangen von der einfach den Fang von IO-Exceptions, um die Abfrage der socket auf allen drei SelectModes. Ich habe auch versucht, mit einer Kombination aus einer Umfrage, mit einem Häkchen auf der 'Verfügbar' - Feld der Steckdose.

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

Auf der server-Seite, einen Versuch zu schreiben eine 'leer' - Zeichen ( \0 ) an den client Kräfte, die eine IO-Exception und der server kann erkennen, dass der client hat die Verbindung getrennt ( ziemlich einfach-gig ).

Auf der client-Seite, die gleiche operation ergibt keine Ausnahme.

//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, dass ich glaube, ich habe in erkennen ein trennen über eine Umfrage, ist, dass ich es relativ einfach auch eine falsche auf eine SelectRead, wenn mein server ist noch nicht geschrieben, nichts an den client zurück, die seit dem letzten check... Nicht sicher, was hier zu tun ist, ich habe gejagt down jede option, um diesen Nachweis, dass ich finden kann, und nichts hat 100% für mich, und letztlich mein Ziel ist es hier zu erkennen, dass eine server - (oder Verbindungs -) Fehler, informieren, client, warten Sie, bis die Verbindung wieder herstellen, usw. Also ich bin sicher, Sie können sich vorstellen, dass diese ist ein integraler Teil.

Schätzen jedermann Anregungen.
Vielen Dank im Voraus.

EDIT: Personen, welche diese Frage sollten Sie beachten, die Antwort unten, und meine LETZTEN Kommentare dazu. Ich erarbeitet habe, wie ich überwand dieses problem, aber noch nicht, um eine 'F&Ein "Stil" post.

  • Nur IOExceptions zu fangen, und verwenden Sie eine lese-timeout. Sie müssen nicht alle diese anderen malarkey.
  • Ich habe versucht, die bereits ( sofern Sie nicht wirklich, lese meine post... ) und es ist hit oder miss. Eine lese-operation ein Timeout nach einer Sekunde bewirkt, dass eine IO, die zwingen würde eine Trennung... Aber was ist, wenn ich nur noch nicht empfangenen Daten...?
  • Ich habe Ihren Beitrag gelesen. Es ist nicht "hit and miss", es unterliegt asynchrone Daten-Pufferung sowohl lokal als auch Remote. Sie erhalten nicht eine Ausnahme auf das erste schreiben eine fehlgeschlagene Verbindung, als er noch nicht entdeckt worden ist: Sie bekommen es in einem späteren schreiben, nach dem TCP Timeout die versuche wiederholen.
  • Tut mir Leid zu sagen, ich Stimme nicht zu. Ich kann Fraps eine Debug-Sitzung wenn Sie möchten...
  • Socket.Erhalten und EndReceive() null zurückgeben, wenn die remote-Seite getan hat, ein Herunterfahren auf seiner Seite. Dies dokumentiert sich in der API-Beschreibung: Wenn Sie einen verbindungsorientierten Socket, die Receive-Methode Lesen so viel verfügbaren Daten bis zu der Größe des Puffers. Wenn der remote-host wird heruntergefahren, die Socket-Verbindung mit der Shutdown-Methode und alle verfügbaren Daten empfangen wurden, wird die Receive-Methode sofort abgeschlossen, und die Rückgabe von null-bytes.
Schreibe einen Kommentar