boost::asio, prüfen ob socket noch verbunden ist



  • Hallo,

    ich benutzte boost::asio für einen Server der TCP-Requests weiterleitet. Sprich, ich habe zwei Benutzer (A und 😎 die sich mit dem Server verbinden und dieser leitet die Daten von A nach B weiter.

    Momentan verbindet sich zunächst der Benutzer dem die Daten gesendet werden sollen (B), anschließend Benutzer A.

    Mein Problem: Das läuft alles asynchron. Angenommen Benutzer B verbindet sich, so wird ab diesem Zeitpunkt ein Port für Benutzer A geöffnet. Sollte sich Benutzer B nun disconnecten bleibt der Port für Benutzer A geöffnet bis sich Benutzer A verbindet und Daten sendet. Das schlägt dann logischerweise fehl. Sollte sich Benutzer A aber niemals verbinden bleibt auch für immer der Port belegt.

    Was ich möchte: Wenn Benutzer B sich disconnected, soll das Socket, das für Benutzer A geöffnet wurde auch geschlossen werden. Das ist nur wichtig falls Benutzer A noch nicht connected ist, wenn Daten ausgetauscht werden merke ich ja, dass es fehlschlägt.

    Meine Frage: Wie kann ich das realisieren? TCP bietet mir ja eigentlich keine direkte Möglichkeit sowas zu prüfen? Muss ich tatsächlich regelmäßig pollen oder so? Wäre für Idee dankbar.

    Viele Grüße



  • Wenn mit "Port öffnen" ein accept gemeint ist, wüsste ich nicht, wie man da etwas mit "pollen" über den Verbindungszustand herausfinden könnte. Aber beim Connect wird doch irgendeine Funktion ausgeführt. Die kann doch ganz einfach ein Flag auf "connected" setzen, das vor dem accept auf "disconnected" gesetzt wurde.



  • Ich glaub da hab ich mich missverständlich ausgedrückt.

    1. Der Server wartet auf Port x auf eingehende Verbindungen ("accept"-Zustand)
    2. Der Empfänger verbindet sich mit dem Server auf Port x und sendet eine Zeichenkette (den Port y der für den Sender geöffnet werden soll)
    3. Der Server wartet auf Port y auf eingehende Verbindungen ("accept"-Zustand)
    4. Der Sender verbindet sich mit dem Server auf Port y und fängt an Daten an den Server zu senden
    5. Der Server leitet die empfangenen Daten an den Empfänger (der sich zuerst verbunden hat) weiter

    Wenn jetzt zwischen Punkt 3 und 4 der Empfänger sich disconnected sehe ich keine Möglichkeit das zu detektieren, da zu diesem Punkt ja keine Daten ausgetauscht werden. Momentan erkenne ich erst, dass es nicht funktioniert, wenn der Sender anfängt die ersten Bytes zu senden (4).

    Und genau da suche ich Lösungsvorschläge. Ich möchte das der Port der für den Sender belegt ist freigegeben wird wenn der Empfänger nicht mehr da ist um die weitergeleiteten Daten zu empfangen.



  • Wenn deine Frage ist, wie du feststellen kannst, dass der Port zu schließen isr: siehe oben.

    Wenn deine Frage ist, wie kann ich boost dazu veranlassen, den Port zu schließen: keine Ahnung

    Wenn deine Frage eine ganz andere ist, habe ich dich nicht verstanden 😉



  • asio_tcp_help schrieb:

    Ich glaub da hab ich mich missverständlich ausgedrückt.

    Wenn jetzt zwischen Punkt 3 und 4 der Empfänger sich disconnected sehe ich keine Möglichkeit das zu detektieren, da zu diesem Punkt ja keine Daten ausgetauscht werden.

    Du kannst weiter auf dem Socket lesen, dann bekommst Du den Verbindungsabbruch der ersten Verbindung mit.


Anmelden zum Antworten