SO_REUSEADDR SOKET PARAMETRO

SO_REUSEADDR SOKET PARAMETRO

Potresti aver provato molte funzioni C, molte funzioni della libreria P Posix C e funzioni C basate su Unix nei programmi. La maggior parte delle funzioni C relative a posix o reti utilizzano alcune flag nella loro parentesi come argomento o utilizzata per scopi specifici. Hai mai provato a imparare alcune bandiere integrate durante la programmazione? In caso contrario, va tutto bene.

Discuteremo l'uso della bandiera SO_REUSEADDR di C in questo articolo. È un flag di tipo booleano intero che specifica se il riutilizzo dell'indirizzo locale dovrebbe essere consentito o meno dalle regole utilizzate per convalidare gli indirizzi forniti nelle chiamate del sistema di associazione. Ciò significa che una presa può legarsi per le prese AF_inet, salvo la presenza di una presa di ascolto attivo collegata all'indirizzo. Non è possibile legarsi alla porta specificata di un socket di ascolto quando è configurata su inaddr_any per qualsiasi indirizzo locale.

Il metodo BIND può riutilizzare l'indirizzo locale dopo aver utilizzato il flag SO_REUSEADDR. Si noti che l'indirizzo locale, che è composto da indirizzo IP e numero di porta, significa che due indirizzi locali possono coesistere in sé se una parte del numero IP o della porta è diverso e pertanto non richiede l'applicazione di questo flag. L'indirizzo locale non può essere utilizzato con questo parametro se è già stato accessibile da una presa che si trova in uno stato di ascolto. Quando l'indirizzo locale della presa è nello stato di ascolto e il componente IP dell'indirizzo è inaddr qualsiasi, tutti gli IP locali sono monitorati. Il bind non può più sostenere gli indirizzi locali per questa porta, anche con questo argomento.

Esempio:

Ecco il codice client utilizzato per i client per connettersi al server utilizzando i due indirizzi IP separati. Il client nell'esempio seguente desidera connettersi al server che utilizza un numero di porta diverso ma lo stesso indirizzo IP. L'indirizzo IP dell'host locale e il valore della porta sono stati passati alla funzione Connect_TCP nella prima chiamata in cui sono stati impostati su 8888.

Tuttavia, dopo aver associato l'indirizzo locale, il sistema ha utilizzato il dominio UNIX Socket per eseguire una seconda connessione socket in cui l'indirizzo IP è rimasto lo stesso, ma il numero di porta è stato modificato in 7777. Significa che un client è collegato a due diversi indirizzi socket su una singola richiesta TCP, che è concepibile perché gli indirizzi sono diversi. Questo codice si collega alla macchina mirata dopo aver vinto prima l'indirizzo locale. I due tentativi di bind dovrebbero avere successo perché, come dimostra il suddetto, la parte IP degli indirizzi locali delle due connessioni di bind.

Utilizzando un terminale di riga di comando Linux, compilare il codice utilizzando il compilatore GCC per il codice della lingua C:

Usando il comando NCAT, imitiamo il server:

Per visualizzare ogni stato del socket per il numero di porta 7777, utilizzare il comando ss:

Il seguente output visualizza lo stato socket per il numero di porta 7777:

Come visto dallo screenshot popolare, ora non c'è altra connessione e solo il server NCAT sta ascoltando sulla porta 7777. Dopo aver eseguito il file di output creato nella fase di compilazione, eseguilo.

Ora, eseguire lo stesso comando dopo aver eseguito il file di output del codice precedente nel terminale Linux. Si noti che ci sono due chiamate alla connessione Connect_TCP, quindi vengono stabilite quattro connessioni durante queste chiamate.

Ora che due connessioni vengono fatte correttamente, una usando 127.0.0.1 e porta 7777 e l'altro usando la porta 8888, abbiamo ricevuto la seguente uscita. Ci sono quattro connessioni complessiva nella schermata seguente perché abbiamo invocato due volte il metodo Connect TCP:

Esistono quattro connessioni di stato Estab (Stabilisci) visibili, che è normale perché l'output è dal lato server e il lato client, rispettivamente. Le prime tre righe sono scritte dal punto di vista del server mentre i due successivi sono presentati da quello del client. Il nome del processo in background mostra anche questo. Prima di partecipare, il client può collegare molti indirizzi IP locali e il server può fare la stessa cosa utilizzando un target. Può legarsi a una varietà di indirizzi locali prima del monitoraggio senza l'argomento SO_REUSEADDR. Non lo illustreremo ora perché il codice software è simile. Il codice prima lega l'indirizzo locale all'indirizzo target, che è 127.0.0.1: 7777 o 127.0.0.1: 7778, quindi eseguire una connessione a quegli indirizzi IP.

Quando eseguiamo questo client, viene visualizzato sullo schermo "l'indirizzo già in uso" indicando che il primo client ha questo indirizzo. Il codice precedente è ora modificato semplicemente aggiungendo alcune più righe del codice per utilizzare il flag SO ReuseADDR. Desideriamo connettere il nostro client a un indirizzo di socket simile che è già utilizzato o detenuto da un altro cliente. Ecco lo snippet del codice del codice modificato:

Abbiamo usato l'editor VIM per aprire il file e aggiunto il codice in modalità inserzione.

Ricompilare il codice. Ma prima di farlo, prendi nota di quanto segue: crea un nuovo file o utilizzane uno esistente e modifica il nome del file di output durante la compilazione. Dopo la compilazione, eseguire il file di output utilizzando il terminale della riga di comando. Dopo l'esecuzione, possiamo vedere che un client è connesso allo stesso indirizzo IP e al numero di porta in cui il nostro primo client era connesso. Questo perché abbiamo usato la flag SO_REUSEADDR.

Conclusione

Si tratta dell'uso del parametro socket SO_REUSEADDR che è un flag di tipo booleano nella lingua C. Abbiamo visto un esempio utilizzando il parametro SO_REUSEADDDR per specificare se l'indirizzo locale riutilizzato in ulteriori programmi o thread dovrebbe essere consentito dalle direzioni utilizzate per autenticare gli indirizzi solo se nelle chiamate di bind system.