Erkennen dass die Gegenseite die TCP Verbindung getrennt hat?



  • Hallo,

    Ich habe mir einen kleinen Server in C unter Linux geschrieben welcher eine TCP-Verbindung entgegennimmt und nach einer Aufforderung vom Client Daten zurücksendet. Das ganze funktioniert eigentlich ganz gut außer, dass ich nicht weiß wie ich erkennen kann das die Gegenseite (das Clientprogramm) die Verbindung getrennt hat. Wenn ich also in diesem Fall auf den Socket schreiben will hängt sich mein Server auf. Wie kann ich also erkennen dass der Client die Verbindung getrennt hat??

    LG



  • eigentlich solltet dein Server SIGPIPE (pipe broken) bekommen, wenn die Pipe zusammenbricht.

    Ich mache immer folgendes: ich ignoriere das SIGPIPE Signal und wenn ich vom socket lese, gucke ich mir, was read zurückgegeben hat:

    • < 0. Fehler, bsp: broken pipe oder connection reset by peer. In diesem Fall errno lesen.
    • == 0: dann hat der Client keine Daten geschickt bzw. die Verbindung ist geschlossen worden.
    • 0: Daten kamen an

    btw: das ist der ANSI C Forum und nicht Linux/Unix Forum, bitte poste die Linux Fragen im richtigen Forum.

    edit: Mist, so viele Schreibfehler bei mir 😡



  • Sollte nicht SIGPIPE eh nur auftreten, wenn der Client sie Leseseite schließt (sprich die Schreibseite zusammenbricht)? Wenn der Schreibende nämlich seinen Socket runterfährt (die schreibende Seite schließt), sollte der Leser direkt 0 als Ergebnis von recv bekommen. Wenn der Client keine Daten geschickt hat, und der Socket nicht blockiert (wenn er blockiert, wartet recv), kommt -1 zurück und errno ist EAGAIN.

    EDIT:
    Ups, es geht ja um die schreibende Verbindung. Ja, da kommt das von supertux gesagte hin.



  • Dankeschön! hat geholfen 🙂


Log in to reply