Hallo!
jmd anders hat geschrieben
Vom Client-Programm wird beim Start eine neue TCP-Verbindung zum Server hergestellt, oft wird diese Verbindung jedoch nicht geschlossen, da das Client-Programm nicht ordnungsgemäß geschlossen wird.
Die Clientverbindung wird automatisch geschlossen, wenn das Programm beendet wird.
Sollte kein Socket Shuddown und oder CloseSocket beim beenden des Programms erfolgen,
schließt das
OS selbstständig alle Handles und Ports.
jmd anders hat geschrieben
Jetzt kommt es zu dem Problem, dass ich irgendwann eine Fehlermeldung als "Daten" vom Server zurückgesendet(als Folge einer Status-Abfrage) bekomme(in unregelmäßigen Abständen).
("Rcv error 10054")
Hierbei finde ich seltsam, dass die Verbindung nicht geschlossen wird, sondern ich nur die Fehlermeldung geschickt bekomme.
Hier sendet der Server nichts zum Client, sondern der darunterliegende Client-Socket verständigt die Application, dass
die Verbindung durch den Server getrennt wurde. Anscheinend wartet der Server auf ein Handshake, und das wird vom
Client nicht gesendet, somit beendet der Server die FALSCHE Anfrage. Der Socket ist bei dieser Meldung schon geschlossen!
jmd anders hat geschrieben
Jetzt ist meine Frage: Was bewirkt das Schließen einer TCP-Verbindung? Wird nur auf dem Client "aufgeräumt" oder wird dem Server acuh mitgeteilt, dass die Verbindung geschlossen werden soll?
Ich kann mir bisher nämlich diese seltsame Fehlermeldung noch nicht erklären.
Das schließen einer
TCP-Verbindung bewirkt, dass Client und Server vom darunterliegenden Socket die Verständigung
bekommen, dass die Verbindung getrennt usw.. wurde. Aufgeräumt müssen nur programmeigene Resourcen, wie zuvor
allocierte Client-Daten, Socket Handles usw. werden. Um den Rest kümmert sich der Socket-Layer (deshalb verwendet man ja die bequemen Sockets).
SirTwist hat geschrieben
Wenn der Client stirbt, erfährt der Server davon nichts.
Bei bestehender Verbindung wird der Server im Normalfall, sofort vom Socketlayer über den Verbindungsabbruch informiert.
Ausnahmen bilden WANS mit speziell konfigurierten Router und oder Switches, da ist es notwendig, das
KEEP_ALLIVE des sockets zu aktivieren, und zu setzen.
SirTwist hat geschrieben
Irgendwann versucht der Server dann das nächste Datenpaket an den Client zu schicken (also an die Ziel-IP mit dem festgelegten TCP-Port), aber der Client hat kein Programm mehr, dass auf diesem Port horcht, also schickt das Betriebssystem ein RST (Reset) zurück. Deshalb bekommst Du am Server die Meldung "Connection reset by peer".
Die Meldung "Connection reset by peer" wird nicht am Server sondern am Client durch den Socket-Layer generiert.
Das
OS sendet auch kein RST zurück. Es wird garnichts zurückgesendet, ausser von der OSI 1+2
SirTwist hat geschrieben
Normalerweise sollte der sich beendende Gesprächspartner ein "Tschüss" (FIN) senden, damit der andere Gesprächspartner Bescheid weiß. Der grüßt dann mit einem "Schönen Abend noch" (FIN ACK) zurück. Dann wird auf beiden Seiten der Port geschlossen und die TCP-Verbindung ist beendet.
FIN, FIN_ACK braucht man nicht senden, das erledigt der Socket Layer Automatisch, dies läuft vollkommen unsichtbar im Hintergrund
ab, darum braucht man sich als OSI 7 Programmierer nicht kümmern.
@jmd anders
Um welche Art von Socket Verbindung handelt es sich?
AF_INET, SOCK_STREAM, IPPROTO_TCP ???
Ist der socket Blocking, Non-Blocking????
Diese Infos wären hilfreich, um genauer zu sagen wo denn eigentlich Dein Problem liegt!
lg.