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