Utilizzo della presa del dominio Unix

Utilizzo della presa del dominio Unix
“Quando è necessario scambiare i dati tra i processi in esecuzione sullo stesso sistema operativo host, viene introdotta una presa di dominio UNIX (UDS) come endpoint di comunicazione dati. La presa di comunicazione tra processi, spesso nota come UDS, è un tipo di presa IPC. I processi in esecuzione sulla stessa CPU possono comunicare efficacemente a causa delle prese di dominio UNIX. Utilizzare la funzione socket e AF_unix come dominio della presa per stabilire un socket di dominio unix. Un socket di dominio unix deve essere associato a un percorso del file specifico utilizzando la funzione di bind dopo che è stata creata. Per comunicare efficacemente tra i processi sullo stesso computer, viene implementata la famiglia di socket AF_Unix (comunemente indicata come AF_LOCAL)."

In passato, le prese di dominio UNIX erano non identificate o collegate a un percorso del file system. All'interno di questo articolo, discuteremo dell'uso della presa di dominio Unix.

Vediamo un esempio in cui abbiamo usato la famiglia AF_Unix Socket Domain per eseguire la comunicazione tra client e server. Possiamo eseguire nuovamente più client su un singolo server, ma per scopi demo, utilizziamo semplicemente il singolo client connesso a un server. In questo caso, due processi diversi, uno in esecuzione per il server e uno in esecuzione per un client, stanno comunicando sullo stesso computer per il quale viene utilizzata la presa di dominio UNIX. Crea un file utilizzando l'editor VIM e nomina Server1.c ma puoi usare nano o qualsiasi altro editore.

Digita le righe successive del codice nel file quando è aperto in modalità inserzione (Escape + I). Innanzitutto, definisci la variabile del nome socket, i.e., Il nome della presa di comunicazione. Nella directory temporanea, abbiamo aggiunto il file socket. Le successive righe di codice vengono prima della funzione principale, compresi i file di intestazione necessari. Viene dichiarata la variabile strutturale del nome socket di tipo Sockaddr_un. Crea quattro variabili del tipo intero da utilizzare in seguito. La creazione della comunicazione socket e canale del server è stata divisa nei seguenti passaggi:

1. Utilizzando la chiamata di sistema Socket () e il flag AF UNIX, il server crea un socket di dominio Unix. Le chiamate di sistema future possono essere effettuate utilizzando il descrittore di file che questo metodo restituisce. La variabile della presa di connessione, che è un descrittore di file server, viene testata nell'istruzione condizionale per vedere se contiene -1, che indica che il processo di costruzione socket non è riuscito.

2. Successivamente, dobbiamo utilizzare la funzione Memset portatile per pulire completamente la memoria. Imposta il nome della famiglia del socket su AF Unix dopo.

3. Affinché il client si connetta, il server lega il socket a un indirizzo ben noto utilizzando la chiamata di sistema Bind (), ma prima di ciò, copiare il nome Socket_.Variabile Sun_Path usando il metodo di copia stringa (strcopy). Usando il risultato del ritorno in un'espressione condizionale, determiniamo se la chiamata del sistema di bind ha avuto esito positivo o meno.

4. La chiamata di sistema Ascolta () viene utilizzata dal server per designare un socket come passivo o come che accetterà le richieste di connessione in arrivo dai client.

5. Il client invia singoli messaggi per ciascuno dei suoi input della riga di comando. Il server calcola le somme dei messaggi in arrivo. La stringa di comando "fine/enter" viene inviata dal client. Il server risponde con un messaggio che contiene i numeri interi del client insieme. Dopo aver stampato la somma dei valori di input in risposta da parte del server, il client esce. Così rapidamente come un nuovo client associati, il server attende utilizzando il loop. Il parametro "giù" può essere utilizzato per terminare il server quando viene invocato il client.

6. L'ascolto di connessione viene eseguito nel primo loop, mentre le operazioni di lettura e scrittura vengono invocate nel secondo ciclo. Quando si invia messaggi ai client, il server impiega la chiamata del sistema di scrittura.

7. Successivamente, la presa peer può essere raggiunta tramite le funzioni di sistema Read () e Write () (i.e., per comunicare tra il server e il client).

8. Infine, il server dovrebbe chiamare il metodo Close () per chiudere la connessione dopo che è l'accesso alla presa.

Utilizzare il comando indicato nello screenshot per compilare il codice su Linux utilizzando il compilatore GCC. Questo comando crea un file di output nominato server.

Ecco il codice del file lato client nel linguaggio di programmazione C. Il nome socket utilizzato nel file del server è anche necessario per la comunicazione. Crea un socket di dominio UNIX dopo l'importazione dei file di intestazione necessari, utilizzando lo stesso approccio del file del server. Il codice di resto è simile al client utilizzando la chiamata di sistema Write () per inviare l'input al server. I parametri nell'intestazione della funzione principale vengono utilizzati per leggere gli input della riga di comando, quindi li scriviamo usando un ciclo per trasmettere al server. Attendi la risposta del server utilizzando il metodo di lettura dopo un'operazione di scrittura riuscita. Il metodo di lettura mantiene la risposta del server in un buffer e quindi la visualizza sullo schermo. Chiudi la connessione socket dopo questa comunicazione.

Esaminiamo come interagiamo il server e il client. Per fare ciò, avremo bisogno di due terminali, in cui dobbiamo prima eseguire il file di output del server prima di avviare il client e inviare gli ingressi al server. Il client esce dopo aver letto e visualizzato la risposta del server.

Nel caso in cui l'indirizzo di bind sia già in uso, in questo caso, utilizzare SO_REUSEADDR come opzione socket.

Se il server è offline e un client desidera connettersi, l'output sarebbe come il di seguito.

Se un client non fornisce alcun numero di input:

Se il client inserisce un numero mentre comunica con il server, il server aggiungerà i numeri e risponderà al client visualizzando il risultato.

Per chiudere il server sulla richiesta del client

Conclusione

In questo articolo, abbiamo dimostrato l'uso sia sul lato client che sul lato server per utilizzare la presa di dominio UNIX. Per questo, abbiamo provato il semplice codice C per entrambi i lati nel sistema operativo Kali Linux. Speriamo che riceverai un buon aiuto da questo articolo.