bind() address already in use

extexo

Mitglied
Hi,

ich hab jetzt schon mehrere Apps unter Linux geschrieben die Sockets nutzen
und bekomme nach dem Neustart des Programms auf der Serverseite immer
wieder bei bind() einen Fehler.
Das passiert nur wenn bereits Clientverbindungen aufgebaut worden sind.

Ich bin mir sicher das ich penibelst genau alle Sockets wieder schließe.
Client- und Serversockets !

Wenn man jetzt eine Weile wartet (scheint von Distri zu Distri unterschiedlich lange zu dauern)
dann kann man den Server wieder starten und die bind() Funktion scheint auch wieder
fehlerfrei zu funktionieren.

Kann mir einer erklären woran das liegt, damit ich mal verstehen kann wieso das
so ist und wie ich am Besten dagegen vor gehen kann?

MfG
 
Hi,

also ich hatte das Problem noch nicht und habe auch schon mehrmals Server geschlossen und wieder gestartet.

Vll postest du mal nen bisschen Code?

Gruß
Anfänger
 
Der Kernel wartet auch nach dem close() noch eine gewisse Zeit auf Pakete auf dem Socket. Und das ist gut so :) Du könntest den Timeout runterschrauben oder gucken, ob Du den Socket wieder aufgreifen könntest.
 
Hallo,
Der Kernel wartet auch nach dem close() noch eine gewisse Zeit auf Pakete auf dem Socket. Und das ist gut so :) Du könntest den Timeout runterschrauben oder gucken, ob Du den Socket wieder aufgreifen könntest.

wie im obigen Link beschrieben kann diese Variante manchmal zu Seiteneffekten führen wenn der Timeout zu kurz gewählt wird.
Man sollte meiner Meinung nach zuerst sicher gehen das der Client in jedem Fall auch wirklich die Verbindung zuerst schließt. Der Server bekommt dann ein EOF geschickt und muss danach (nach einer kleinen Wartefrist von 2-3 Sekunden) ebenfalls die Verbindung sauber schließen, dann sollte dieser Fehler auch nicht auftauchen.

Gruß,
RedWing
 
Hallo,

Danke für diese qualifizierte Antwort.

Die eigentliche Lösung hieß dann aber doch:
Code:
    int val = 1;
    setsockopt( sock_server, SOL_SOCKET, SO_REUSEADDR, &val, sizeof( val ) );

ich glaube du hast den Link nur halbherzig gelesen. Denn dort steht unter anderem auch genau dieser Weg beschrieben.

Gruß,
RedWing
 
Zurück