Socket bind Problem

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
mfst
Beiträge: 2
Registriert: 25.10.2010 09:24:55

Socket bind Problem

Beitrag von mfst » 25.10.2010 09:45:35

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

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Socket bind Problem

Beitrag von gms » 25.10.2010 11:48:23

Willkommen im Forum!

Code: Alles auswählen

gms2 ~ # perror 98
OS error code  98:  Address already in use
gms2 ~ # 
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

Code: Alles auswählen

echo "net.ipv4.tcp_fin_timeout=15" >>/etc/sysctl.conf
sysctl -p
Warnung: eine "zu niedrige" Einstellung dieses Parameters gilt als Sicherheitsrisiko

Gruß
gms

mfst
Beiträge: 2
Registriert: 25.10.2010 09:24:55

Re: Socket bind Problem

Beitrag von mfst » 26.10.2010 12:54:59

Hallo!

Vielen Dank für die Antwort. Habe den Timeout angepasst:

Code: Alles auswählen

sysctl -p
net.ipv4.tcp_fin_timeout = 2
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

Antworten