Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Linux/Unix ::  Sockets: Auf Verbindung überprüfen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
sockel
Unregistrierter




Beitrag sockel Unregistrierter 16:10:54 02.08.2016   Titel:   Sockets: Auf Verbindung überprüfen            Zitieren

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:

C:
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.
dachschaden
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2014
Beiträge: 1267
Beitrag dachschaden Mitglied 07:10:37 03.08.2016   Titel:              Zitieren

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.

_________________
"'Das habe ich getan' sagt mein Gedächtnis. Das kann ich nicht getan haben - sagt mein Stolz und bleibt unerbittlich. Endlich - gibt das Gedächtnis nach." - Friedrich Nietzsche
The only valid measurement of code quality: WTFs/minute
TyRoXx
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.06.2009
Beiträge: 1750
Beitrag TyRoXx Mitglied 16:04:17 03.08.2016   Titel:              Zitieren

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.
sockel
Unregistrierter




Beitrag sockel Unregistrierter 16:28:56 03.08.2016   Titel:              Zitieren

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

C++:
        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:

C++:
    signal(SIGPIPE, SIG_IGN);
namehier
Unregistrierter




Beitrag namehier Unregistrierter 22:35:14 13.08.2016   Titel:              Zitieren

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

Zitat:

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.
C++ Forum :: Linux/Unix ::  Sockets: Auf Verbindung überprüfen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.