Sockets: Auf Verbindung überprüfen



  • Hallo,

    ich wollte mal nachfragen, ob es irgendeine Möglichkeit gibt, bei einem Socket zu überprüfen, ob er mit einem Server verbindet ist. Ich habe dazu folgenden Code im Internet gefunden:

    int error = 0;
    socklen_t len = sizeof (error);
    int retval = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &error, &len);
    

    Aber das ist mir nicht spezifisch genug! Man stelle sich vor, der Socket ist nur korrekt erstellt worden, aber nicht verbindet, dann hauts nicht hin. Was ich also suche, ist was genaueres.



  • Was zumindest mir sofort einfallen würde:
    Anfrage in den Socket schreiben, auf Antwort warten. Wenn diese syntaktisch korrekt ist, ist dein Socket mit irgendwas verbunden, was antwortet.

    Woran erkennt man, dass man lebt?
    Dass die Außenwelt auf einen reagiert.



  • Woher hast du das Socket denn, wenn du nicht weißt, ob es verbunden worden ist?

    Ich schätze mal man kann ein non-blocking read der Länge 0 auf dem Socket machen, um zu prüfen, ob es am lokalen Ende noch aktiv ist. Rückgabewert 0 oder errno EAGAIN würde heißen, dass die Verbindung prinzipiell noch offen ist.

    Wenn du wissen musst, ob die andere Seite wirklich noch da ist, musst du etwas von dort empfangen.



  • Danke für die Antworten, ich habe das jetzt so gelöst:

    bool connected() const{
                return ::send(sock.file_descriptor(), nullptr, 0, 0) >= 0;
            }
    

    Einziges Problem: Wenn der Socket nicht verbindet ist, lässt es ein SIGPIPE fliegen. Das kann man mit folgender Zeile jedoch umgehen:

    signal(SIGPIPE, SIG_IGN);
    


  • Nicht sicher, ob das zum gegebenen Problem passt (v.a. wegen der Quelle des Sockets), aber generell gilt:

    When the connection has been established asynchronously, pselect(), select(), and poll() shall indicate that the file descriptor for the socket is ready for writing.

    (von man connect)

    Das heißt, wenn du asynchrone Sockets verwendest, kannst du z.B. via pselect() und der readfds-Liste schauen, ob ein connect()-Aufruf funktioniert hat.


Anmelden zum Antworten