Hallo zusammen,
bisher habe ich ein Programm auf SuSE 9.3 laufen lassen, das sockets nutzt. Das Programm lies sich aus der Konsole per Strg+C beenden und sofort danach wieder öffnen. Vor einiger Zeit habe ich auf Debian lenny umgestellt. Jetzt gibt es folgendes Problem: Nach dem Beenden lässt sich das Programm etwa eine Minute lang nicht wieder öffnen, da beim Initialisieren der sockets ein "bind failed errno=98" auftaucht. Allerdings kam mit netstat raus, dass kein socket mehr hört. Ich vermute, dass das am OS liegt. Der Quellcode des Programms ist aber nur teilweise verfügbar. Daher kann ich nicht direkt in den Code eingreifen. Hat jemand einen Tipp, eine Idee, wie das Problem OS-seitig unterbunden werden kann?
Vielen Dank für Hinweise!
Beste Grüße
Michael
Socket bind Problem
Re: Socket bind Problem
Willkommen im Forum!
das liegt nicht am OS, das liegt daran, daß der Socket von der Applikation nicht ordnungsgemäß geschlossen wurde und daher vom OS ein Timeout abgewartet werden muß, bis der Socket entgültig wieder freigegeben werden kann. ( bis dahin befindet sich der Socket im TIME_WAIT Status )
Lediglich die Zeitspanne dieses Timeouts haben auf unterschiedlichen Systemen unterschiedliche Defaultwerte
Unter Linux lassen sich diese über net.ipv4.tcp_fin_timeout konfigurieren
Warnung: eine "zu niedrige" Einstellung dieses Parameters gilt als Sicherheitsrisiko
Gruß
gms
Code: Alles auswählen
gms2 ~ # perror 98
OS error code 98: Address already in use
gms2 ~ #
Lediglich die Zeitspanne dieses Timeouts haben auf unterschiedlichen Systemen unterschiedliche Defaultwerte
Unter Linux lassen sich diese über net.ipv4.tcp_fin_timeout konfigurieren
Code: Alles auswählen
echo "net.ipv4.tcp_fin_timeout=15" >>/etc/sysctl.conf
sysctl -p
Gruß
gms
Re: Socket bind Problem
Hallo!
Vielen Dank für die Antwort. Habe den Timeout angepasst:
Trotzdem kann das Programm die Sockets wieder nicht binden, auch wenn ich fünf Sekunden mit dessen Start warte. Vielleicht werden die Sockets tatsächlich nicht richtig geschlossen, allerdings hört nach dem Beenden des Proggramms ja auch niemand mehr auf dem entsprechenden Port.
Gibt es weitere Möglichkeiten/Ideen?
Herzlichen Dank und Grüße
Michael
Vielen Dank für die Antwort. Habe den Timeout angepasst:
Code: Alles auswählen
sysctl -p
net.ipv4.tcp_fin_timeout = 2
Gibt es weitere Möglichkeiten/Ideen?
Herzlichen Dank und Grüße
Michael