Unter Linux den Port wieder freigeben

Für allgemeine Fragen zur Programmierung mit PureBasic.
dreamtec
Beiträge: 13
Registriert: 06.06.2008 14:34

Unter Linux den Port wieder freigeben

Beitrag 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?
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Den Server sauber beenden?
(\/) (°,,,°) (\/)
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

"strg-c" kann man abfangen, zumindest kenne ich das so unter Windows, und unter Linux wird es das sicherlich auch geben.
dreamtec
Beiträge: 13
Registriert: 06.06.2008 14:34

Beitrag 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....
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag 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
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag 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
"...smoking hash-tables until until you run out of memory." :P
Antworten