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

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

  
C++ Forum :: MFC (Visual C++) ::  Socket rausgerissen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Achromat
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.06.2013
Beiträge: 253
Beitrag Achromat Mitglied 16:26:28 13.02.2017   Titel:   Socket rausgerissen            Zitieren

Hallo zusammen,

da habe ich zwei klein -Computer die sich über socket unterhalten.

Fall 1) Ich beende einen der beiden durch herunterfahren,und erhalte
ein Event das die Verbindung down ist (Linux Signal).
(Wunderbar)

Fall 2) Ich ziehe den Stecker. Und die andere Station wird ewig hängend
nie ein Signal oder Event erhalten auch recv kommt nie mehr zurück.
(Unterschied nun doch erschreckend) Nie getestet unter PC's die man
ja nicht dauern ausschaltet.(Runterfahren ist damit nicht gemeint)

Frage 1)
Was läuft falsch ?

Frage 2)
Wie kann ich gewaltsame Verbindungstrennung erkennen
ich verwende das allerdings unter Linux. Steuere das aber über MFC :)

Mit Nichten
Beste Grüße aus Preußen.
K.
dachschaden
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2014
Beiträge: 938
Beitrag dachschaden Mitglied 18:13:43 13.02.2017   Titel:   Re: Socket rausgerissen            Zitieren

Achromat schrieb:
Was läuft falsch ?


Du ziehst den Stecker.
Wenn du runterfährst, schließt das System alle Verbindungen einvernehmlich (gracefully). Wenn du dagegen den Stecker ziehst, dann kann das System nicht mehr senden, dass die Verbindung geschlossen werden soll. Ist ja eigentlich auch logisch - woher soll das System auch wissen, dass du jetzt den Stecker ziehst?

Achromat schrieb:
Wie kann ich gewaltsame Verbindungstrennung erkennen


Gar nicht. Aber was du machen kannst, ist Annahmen treffen.
Für gewöhnlich hat's einen Default-TCP-Timeout, der aber in der Regel echt groß ist. Zu groß. Aber wenn er dann fehlschlägt, dann kehrt recv / read zurück, in der Regel mit einem Fehler (errno).

Du kannst aber mit select auf einem Socket hören und dabei deinen eigenen Timeout definieren. Wenn dann innerhalb von 5 Sekunden oder was du auch immer definierst nichts kommt, kehrt select zurück, sagt, dass auf deinem Socket keine Daten angekommen sind, und dann kannst du den Socket schließen.

_________________
Meine sämtlichen Posts sind gleichzeitig als Provokation gemeint, mich in Frage zu stellen. Ich erwarte, dass man mich in Frage stellt und auch korrigiert.
The only valid measurement of code quality: WTFs/minute
Achromat
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.06.2013
Beiträge: 253
Beitrag Achromat Mitglied 21:37:44 13.02.2017   Titel:              Zitieren

Hallo,
ah select... ich habe bereits einen Signal handler, der auch
angegangen wird wenn auf ungültigen sockets geschrieben wird.

Es ist doch etwas anders unter Linux. Oft verstellte man unter
Windows die Zeiten mit SetSockOpt.

Ich werde das nun in Betracht ziehen, vielen Dank.
k aus b


Zuletzt bearbeitet von Achromat am 21:38:22 13.02.2017, insgesamt 1-mal bearbeitet
C++ Forum :: MFC (Visual C++) ::  Socket rausgerissen   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.