Joho,
Ich habe gerade kein Werk über TCP/IP zur Hand, und muß zugeben,
daß ich eventuell mehr hätte aufpassen sollen; wie auch immer:
Schaem dich! ;-)
Wie bemerkt man, daß eine TCP/IP Verbindung zusammengebrochen ist?
Gar nicht. Entweder sie wird korrekt Abgebaut (inkl.
FIN-ACK-FIN-ACK-Folge) oder man muss auf den Timeout warten.
Ich habe einen Server geschrieben, der 24/7 läuft. Wenn meinen
dynamische IP wechselt, werden alle Verbindungen zum
Server unterbrochen (logisch). Der Server merkt das aber gar
nicht, denn schliesslich schliesst niemand die Verbindung. Weil
die Clients senden können, wenn sie wollen, aber nicht müssen,
und der Server nur sendet, wenn ein Client vorher gesendet hat
(es ist so eine Art Broadcasting-Server), wartet der Server nach
dem IP-Wechsel ewig darauf, daß etwas passiert.
Stell den Timeout kleiner. 60s statt den Standard 120 reichen dicke.
Die Clients können sich nicht wieder am Server einloggen, weil
jeder client sich mit einem passwort anmelden muss und der
Server keine Doppelverbindungen zulässt (und der Server denkt ja,
die Clients sind noch verbunden, senden nur gerade nichts).
Was kann ich da machen?
Wir den alten Client raus, wenn sich jemand neu einloggt.
Was passiert z.B., wenn der Server
versucht, über die zusammengebrochenen Verbindungen zu senden?
Nichts. Der Sende-Buffer wird voller und voller und laeuft evntl.
irgendwann ueber und nach dem Timeout wird er verworfen, aber mehr
passiert nicht. Also, bei deinem (meinem? ;-) Nonblocking-Server.
Bei einem anderen waere das halt so, dass, wenn der Buffer voll ist,
der Server im IOWAIT ertrinkt.
Merkt er dann, daß die Verbindungen geschlossen wurden?
Erst nach dem Timeout.
Ist also das Senden von Test-Paketen alle paar Sekunden (mit
Timout, wenn nichts zurückkommt) die einzige Lösung für dieses
Problem?
Nein - siehe oben. Aber auch ein schoener Ansatz, IMHO - IRC macht
das ja aehnlich.
Gruss,
CK