Socket-Verbindung dauerhaft kontrollieren



  • Hallo,

    Ich bin auf der Suche nach einer Möglichkeit bei einem Event eine Handlung auszulösen. Dafür gibt es in C++ EventHandler und Design-Patterns wie das Observer Pattern.
    Meine Handlung bezieht sich auf eine Schnittstelle eines C++ Clients zu einem Java Server über Sockets. Der Java Server sendet einen String an den C++ Client und wird weiter verarbeitet. Diese Daten kommen jedoch nicht ständig.
    Ich suche nun eine Lösung diese Verbindung stetig zu kontrollieren, ob Daten ankommen oder nicht. Was ist hierfür am besten geeignet? Bin ich auf dem richtigen Weg?

    Vielen Dank!

    Timmus



  • Du willst also einfach einen Listener bei einkommenden Daten aufrufen? Einfach in einem zweiten Thread die Daten empfangen (normalerweise blocken funktionen wie recv ja) und dann den Handler aufrufen, bzw das Event in den Hauptthread delegieren, welcher dann jenen aufruft.



  • Glaub sein Problem ist eher, das er mitbekommen will, ob der Server oder die Verbindung abgeraucht ist, aber nicht garantiert ist, das im Normalbetrieb ständig auch daten kommen.

    "Normal" sollten blockierende funktionen auch zurückkehren mit entsprechenden fehlercode, wenn der Stack erkennt das die verbindung weg ist.
    Aber glaub 100% ist das auch nicht garantiert ... bzw wirst das vielleicht OS spezifisch händeln müssen. glaub man muss auch keep alive einschalten, damit der stack das mitbekommt.

    http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

    Alternative wär selber nen alive counter auf Logik ebene und time handling.
    aber normal sollte das tcp schon machen ^^

    Ciao



  • Mit keepalive: keine Ahnung. Sollte funktionieren. Muss man halt pro Verbindung extra anfordern und die Timeouts konfigurieren.

    Ohne keepalive bekommst du Verbindungsabbrüche nur mit wenn du versuchst Daten zu senden. Dabei dann aber ziemlich zuverlässig - kann mir nicht vorstellen dass es da Fälle gibt wo es nicht erkannt wird. Kommt ja keine Empfangsbestätigung und nach so-und-so-vielen Retries gibt der Stack dann halt auf.

    Ich glaub aber dass es Timmus wirklich um das Empfangen von Nachrichten geht.



  • Hallo,

    vielen Dank für eure Antworten!

    Ja mir geht es wirklich nur um das Empfangen von Nachrichten über Sockets, zum Beispiel Hashwerte von Passworten oder einfache Benutzernamen. Habe ich es richtig verstanden, dass Multithreading ein guter möglicher Lösungsansatz ist?

    Liebe Grüße

    Timmus


Anmelden zum Antworten