AW: Avanti: bind() failed
Martin Butkus
m.butkus at tu-bs.de
Di Jul 29 10:15:03 CEST 2003
In message <51162B178B7 at buch.biblio.etc.tu-bs.de> you write:
Hallo Herr Fischer,
> Ich gehe derzeit davon aus, dass
> - die Meldung zeigt, dass bei Neustart von Avanti der Port 4949 nicht verfügba
> r war,
> - das Problem behoben ist, wenn man den Server nach kurzer Pause (ca. 2 Min.)
> neu startet.
Was Sie beobachten, hat nur mit der Architektur des TCP/IP-Protokolls
zu tun, aber nichts mit Avanti.
TCP realisiert einen kontinuierlichen "Datenstrom" auf einemo
paket-orientierten Protokoll (IP). Dazu teilt TCP den Datenstrom
in einzelne Pakete, nummeriert diese, versieht sie mit der
Ziel-Adresse (IP und Portnummer), sowie einer Prüfsumme und
versendet sie schließlich via IP. Auf der Empfängerseite wird
wieder alles zusammengesetzt.
Nun garantiert IP aber nicht, daß Pakete "in der richtigen Reihenfolge"
beim Empfänger ankommen (oder daß sie überhaupt ankommen).
Wenn nun nach einem Absturz sofort wieder ein neuer Daemon auf
Port 4949 lauschen dürfte, könnte es sein, daß er Pakete erhält,
die eigentlich für seinen Vorgänger bestimmt waren, und sie
irrtümlich in seinen eigenen Datenstrom einbaut.
Um das zu verhindern, wartet das Betriebssystem nach dem Close
eine gewisse Zeitlang ab (sog. TIME_WAIT Zustand in der
TCP-State-Machine). Pakete, die in dieser Zeit eintreffen,
werden verworfen. Programme, die in dieser Zeit versuchen,
sich an den Port 4949 zu "binden", werden abgewiesen.
Man kann also sagen, daß es sich um ein ganz normales,
und absolut standardkonformes Verhalten handelt.
Die Avanti-Problematik ist damit natürlich nicht gelöst.
Um eine vorläufige Abhilfe wegen der Abstürze unter Windows zu
schaffen, möchte ich einen Wrapper für den avanti-cl bauen,
der ja - soweit ich Herrn Eversberg da richtig verstanden habe -
das Speicherleck nicht aufweist.
Der Wrapper wird der Art eines "Inet-Daemons" wie unter Unix
bekannt funktionieren, d.h. er lauscht auf Port 4949, und startet
für jede eingehende Verbindung im Hintergrund eine Instanz des
Avanti-CL. Die über die TCP/IP-Verbindung eingehenden Daten bekommt
der avanti-cl dann als Standard-Input geliefert, sein Standard-Output
wird dagegen abgefangen und über die TCP/IP-Verbindung versendet.
Freundliche Grüße,
Martin Butkus
Mehr Informationen über die Mailingliste Allegro