Seite 1 von 1

Unter Linux den Port wieder freigeben

Verfasst: 05.02.2009 14:11
von dreamtec
Ich hab da ein kleines Problem. Ich hab ne kleine Anwendung geschrieben, die als Server dient. Soweit funktioniert auch alles.

Mein Problem ist nu, dass wenn ich den Prozess kille (mit strg + c tritt auch manchmal das Problem auf), dann brauch Linux ne gewisse Zeit, bis der Port wieder freigegeben wurde (habe keine grafische Oberfläche).

Wie kann ich diese Wartezeit umgehen?

Verfasst: 05.02.2009 14:47
von KeyKon
Den Server sauber beenden?

Verfasst: 05.02.2009 18:38
von DarkDragon
Nein ich glaube es gibt keine Möglichkeit außer ein reboot bzw. runlevel-wechsel. Ich habe mich das auch schon oft gefragt. Wenn ein Programm crasht will ich doch weiter arbeiten können und nicht für immer blockiert dasitzen.

Verfasst: 05.02.2009 21:05
von edel
"strg-c" kann man abfangen, zumindest kenne ich das so unter Windows, und unter Linux wird es das sicherlich auch geben.

Verfasst: 06.02.2009 01:40
von dreamtec
slso an "sauber beenden" hab ich auch schon gedacht. Nur wenn aus irgendeinem Grund der Server abschmiert, dann habe ich ein Riesen Problem.

@DarkDragon
Das hört sich nicht gut an. Nur andere Programme können das doch auch. Also wenn ich beispielsweise vsftpd kille, dann kann ich das doch auch sofort wieder starten (also Port 21 ist sofort frei). Demzufolge müsste das doch auch bei meinem Server möglich sein. Die Frage ist nur wie....

Verfasst: 06.02.2009 09:02
von Kukulkan
Hallo,

Ich hab das Problem auch, aber auch mit sauberem beenden (also schön brav CloseNetworkServer() aufgerufen). Aber es dauert bis zu einer Minute, bis der Port wieder frei ist... :(

Volker

Verfasst: 06.02.2009 18:59
von Thalius
Sollte sich mit der Möglichkeit eines Flags für :

Code: Alles auswählen

SO_REUSEADDR
lösen lassen - der normale bind aufruf im PB OpenNetworkConnection() benutzt:

Code: Alles auswählen

TIME_WAIT
mal fr34k anhauen. ;)

Code: Alles auswählen

int sock, ret, on;
struct sockaddr_in servaddr;

/* Create a new stream (TCP) socket */
sock = socket( AF_INET, SOCK_STREAM, 0 ):

/* Enable address reuse */
on = 1;
ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );

/* Allow connections to port 8080 from any available interface */
memset( &servaddr, 0, sizeof(servaddr) );
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
servaddr.sin_port = htons( 45000 );

/* Bind to the address (interface/port) */
ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );


Cheers, Thalius