none
TCP: Erkennung eines Verlust der Verbindung RRS feed

  • Frage

  • Hallo,

    ich habe einen Chat programmiert, der auch mehr oder weniger gut funktioniert. Der Chat besteht aus einem Host und mehreren Clients, die miteinander kommunizieren. Es geht mir eigentlich darum, wie der Host erkennt, dass die Verbindung zu einem Client nicht mehr besteht. Ich habe das mit einer IOException behandelt, aber das hat nur geklappt, wenn der Client mit End geschlossen wurde. Sonst habe ich es einfach nicht hingekriegt, den Client sauber zu schließen.

    Vielen Dank im Voraus


    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10

    Donnerstag, 7. März 2013 19:00

Antworten

  • Vielen Dank für die Antworten! Ich habe dieses Problem jetzt auf diese Weise gelöst: Sobald der Client ein Nachrichtenpaket sendet das Nothing (also "") ist, schmeißt der Host den Client raus. Ich weiß auch nicht warum, aber sobald es den Client nicht mehr gibt, erhält der Host die ganze Zeit solche Pakete.


    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10

    • Als Antwort markiert Bolzen Samstag, 13. Juli 2013 07:43
    Samstag, 13. Juli 2013 07:43

Alle Antworten

  • Hi Bolzen,

    ich bin in dem Bereich jetzt kein Experte.

    Mir ist nicht ganz klar wo dein Problem liegt.

    Wenn der Client beendet wird, sollte er sich sauber abmelden.

    Wenn die Verbindung zum Client abgebrochen ist, solltest du beim Senden über dem TimeOut eine SocketException bekommen. Dann entfernst du den Client.

    Also kann es dich nur Interessieren zu Prüfen ob der Client nicht da ist wenn "längere" Zeit keine Nachricht mehr gesendet wurde. (Ob es wirklich Interessant für den Benutzer ist, weiß ich jetzt nicht.)

    Ich würde dann einfach mehrere Pings an den Client Senden und Prüfen ob einer zurück kommt.

    MFG

    Björn 

    Donnerstag, 7. März 2013 20:26
  • Hi Bolzen.

    Mitbekommen tust du es nur dann, wenn du die Verbindung permanent aufrecht erhalten würdest. Da bei einem Chat aber in der Regel für jeden gesendeten Text eine Verbindung kurz aufgebaut wird, dann gesendet wird, und diese anschließend wieder geschlossen wird, hast du außer während des Sendens selbst keinerlei Kontrolle über eine "ununterbrochene Leitung" zu deinem Client.

    Wie Palin schrieb habe ich es in einem TCP-Client-Server-Test auch umgesetzt: ich habe permanent in regelmäßigen Abständen kurze Pings bzw. Testnachrichten geschrieben. Ist eine davon nicht übertragbar bzw. kommt der Ping nicht zurück, so ist die Leitung unterbrochen und der Client wird als disconnected markiert bzw. rausgeworfen.

    LG, Dennis.

    Freitag, 8. März 2013 09:57
  • Hallo Dennis,

    wie würde denn so eine Ping dann aussehen?


    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10

    Dienstag, 12. März 2013 16:10
  • Naja, du schickst halt einfach ein Testpaket, also irgendeine kurze Nachricht. Ein Punkt oder ein Leerzeichen reicht vielleicht schon.

    In meinem Fall hab ich versucht ein eigenes Protokoll mit eigenem Befehlssatz zu implementieren (so dass nicht alles verarbeitet wurde, sondern nur das, was auch erwartet wurde), und das kannte eben den Ping-Befehl, und schickte ein Pong zurück. So war gewährleistet, dass die "andere Seite" noch lief, und nicht irgendwas abgestürzt war.

    Ich meinte das jetzt eher im übertragenen Sinne ...

    LG, Dennis.

    Mittwoch, 13. März 2013 11:09
  • Tut mir leid, dass ich so spät antworte.

    In regelmäßigen Abständen eine Ping zu versenden, klingt nach einer guten Lösung.

    Aber geht das mit einer Exception nicht einfacher? Der Host/Server fragt die ganze Zeit Daten aus einem NetworkingStream ab. Ist dieser Stream nicht mehr vorhanden, wird eine IOException ausgelöst. Dann fange ich mit der Catch-Struktur den Fehler ab und "schmeiß" den Client raus. Ich habe das schon mal getestet, aber es funktioniert nur, wenn der Client mit End geschlossen wird. Es wäre für mich auch interessant zu wissen wie das funktioniert, da dahinter wahrscheinlich viel geringerer Aufwand steckt.


    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10



    • Bearbeitet Bolzen Samstag, 29. Juni 2013 15:46 grund
    Montag, 18. März 2013 16:22
  • Vielen Dank für die Antworten! Ich habe dieses Problem jetzt auf diese Weise gelöst: Sobald der Client ein Nachrichtenpaket sendet das Nothing (also "") ist, schmeißt der Host den Client raus. Ich weiß auch nicht warum, aber sobald es den Client nicht mehr gibt, erhält der Host die ganze Zeit solche Pakete.


    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10

    • Als Antwort markiert Bolzen Samstag, 13. Juli 2013 07:43
    Samstag, 13. Juli 2013 07:43