Bio: Verbindungsabbruch bei TCP/IP erkennen

Hallo!

Ich habe gerade kein Werk über TCP/IP zur Hand, und muß zugeben, daß ich eventuell mehr hätte aufpassen sollen; wie auch immer:

Wie bemerkt man, daß eine TCP/IP Verbindung zusammengebrochen ist?
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.
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? Was passiert z.B., wenn der Server versucht, über die zusammengebrochenen Verbindungen zu senden? Merkt er dann, daß die Verbindungen geschlossen wurden?
Ist also das Senden von Test-Paketen alle paar Sekunden (mit Timout, wenn nichts zurückkommt) die einzige Lösung für dieses Problem?
Ich fände das so niederschmetternd unelegant.

Gruesse,

Bio

  1. 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