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?
Unter Linux den Port wieder freigeben
-
- Beiträge: 6267
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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.
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....
@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....
Sollte sich mit der Möglichkeit eines Flags für :
lösen lassen - der normale bind aufruf im PB OpenNetworkConnection() benutzt:
mal fr34k anhauen.
Cheers, Thalius
Code: Alles auswählen
SO_REUSEADDR
Code: Alles auswählen
TIME_WAIT
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