Socket-Frage: Blockierendes recv() abbrechen?



  • Hallo an alle.

    Ich habe ein kleines Auktionssystem programmiert. Alles funktioniert so weit, bis auf das Beenden des Programmes. Denn da ist noch ein Thread, der im recv() hängt!
    Und ich verzweifel daran, wie ich dem sagen kann, "hey, brich dein recv() ab, du musst zum ende kommen"..........

    Wie realisiere ich ein Abbruch des blockierenden recv()'s?

    Danke jetzt schon...!
    Chris



  • du könntest mit select(2) bzw poll(s) erst prüfen ob überhaupt daten zum lesen da sind.



  • Das ist nicht so einfach. Der Hinweis auf select oder poll war aber genau richtig.

    Im Prinzip funktioniert das so, daß Du den Datei-deskriptor auf nicht blockierend setzt. Dann machst Du eine pipe, welche einen lesenden und einen schreibenden Datei-deskriptor erzeugt. Auf deinen Socket und den lesenden Teil machst Du dann ein poll (oder select, aber ich bleibe mal beim poll, weil ich es so gewöhnt bin) und rufst recv nur auf, wenn poll Dir sagt, das etwas ansteht. Willst Du zum Ende kommen schreibst Du auf den schreibenden Datei-deskriptor der pipe. Damit unterbrichst Du poll und der Empfangs-Thread kann jetzt darauf reagieren.

    Ein weiterer Vorteil, den man sich damit bekommt ist, daß poll auch ein Timeout hat, was bei der Netzwerkprogrammierung häufig sehr nützlich ist.

    Tntnet



  • ChrisK schrieb:

    Ich habe ein kleines Auktionssystem programmiert. Alles funktioniert so weit, bis auf das Beenden des Programmes. Denn da ist noch ein Thread, der im recv() hängt!
    Und ich verzweifel daran, wie ich dem sagen kann, "hey, brich dein recv() ab, du musst zum ende kommen"..........

    einfach beim beenden des programms den den socket schliessen. recv() kommt dann mit 'nem fehler raus und der thread weiss damit, dass er sich beenden soll.



  • Hi Ihr.
    Also ich versuche gerade, den Socket einfach zu schließen mit Close.
    Allerdings mag das nicht so klappen.

    Hab halt int socket;
    socket = accept und so weiter.
    Und close(socket); mag den irgendwie nicht aus seinem recv() reißen...

    Ich probiers aber morgen gleich nochmal, vielleicht habe ich einen Fehler eingebaut.
    Oder was könnte da nicht funktionieren?

    MfG
    Chris



  • ChrisK schrieb:

    Hi Ihr.
    Also ich versuche gerade, den Socket einfach zu schließen mit Close.
    Allerdings mag das nicht so klappen.

    Hab halt int socket;
    socket = accept und so weiter.
    Und close(socket); mag den irgendwie nicht aus seinem recv() reißen...

    Ich probiers aber morgen gleich nochmal, vielleicht habe ich einen Fehler eingebaut.
    Oder was könnte da nicht funktionieren?

    MfG
    Chris

    Mach es so wie tntnet es gesagt hat. Aber du musst den Socket nicht auf nicht-blockierend setzen.



  • Alles klar. Dann werde ich es so probieren. Danke



  • Also unter Windows werden recv und send abgebrochen wenn man den Socket aus einem anderen Thread heraus schließt.



  • Ja und unter Linux?



  • Theoretisch müsste recv eigentlich mit einer Fehlermeldung beenden, wenn ich den socket schliesse. Aber halt nur theoretisch. Das ist kein dokumentiertes Verhalten und daher darf man sich darauf nicht verlassen.

    Es mag sein, daß es mit einigen Unix-Varianten und einigen Windows-Versionen funktioniert und mit anderen nicht. Daher meine Vorgehensweise mit poll, welches nur dokumentiertes Verhalten verwendet.

    Prinzipiell sollte man beim programmieren sich mehr an der Dokumentation als am Ausprobieren orientieren. Nur so kann man sicher sein, daß das Programm morgen noch funktioniert.

    Tntnet


Log in to reply