Come impedire che le porte di rete rimangano aperte in caso di arresto anomalo del programma

StackOverflow https://stackoverflow.com/questions/1008608

Domanda

Ho preso Computer Networking lo scorso semestre e ho fatto un po 'di programmazione C in Linux (usando gcc) per i miei progetti. Una cosa estremamente noiosa in cui continuavo a correre era se il mio programma si arrestasse o si bloccasse (che avrei dovuto premere Ctrl + C per ucciderlo), la porta di rete sarebbe rimasta aperta per circa un minuto. Quindi, se volessi eseguire di nuovo immediatamente il programma, dovrei prima andare nel file di intestazione, cambiare la porta, rifare il programma e infine eseguirlo. Ovviamente, questo diventa molto noioso molto velocemente.

Esiste un modo per configurarlo in cui la porta viene immediatamente rilasciata non appena il processo viene interrotto? O tramite alcune impostazioni in Linux, o nel makefile per il mio programma, o anche programmaticamente in C?

Modifica: mi riferisco a quando scrivo un server e scelgo una porta specifica per ospitare il programma.

È stato utile?

Soluzione

Impostare l'opzione SO_REUSEADDR sul socket.

int yes = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

Da Guida di Beej alla programmazione in rete .

Altri suggerimenti

Scommetto che sono circa due minuti :) Come notato da @Cogsy, l'opzione socket SO_REUSEADDR è tua amica. Familiarizzare con gli stati TCP, è lo stato TIME_WAIT che ti causa problemi:

 

Suppongo che il programma che stai scrivendo sia un server, quindi devi usare una porta nota. In tal caso, dovresti usare l'opzione SO_REUSE_ADDR sul socket come sottolineato da Cogsy.

Se invece stai scrivendo un client sw, allora dovresti evitare di scegliere una porta particolare, permettendo al sistema di consegnartene una casuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top