La struttura Sockaddr_in

La struttura Sockaddr_in

La programmazione di socket nel linguaggio C utilizza una varietà di funzioni, molte di esse vengono utilizzate per risolvere, convertire e determinare l'indirizzo del server a cui vogliamo connetterci. Indubbiamente, l'indirizzo IP è le informazioni più importanti di cui abbiamo bisogno quando apriamo una presa. E affrontare questi indirizzi richiede che conosciamo le strutture in cui sono archiviate, il tipo di dati di ciascuno dei loro membri, ecc.

In questo Articolo di Linux suggerimenti, Imparerai tutto sul tipo di SOCADDR_IN Strutture utilizzate dalle funzioni di sistema per archiviare gli indirizzi per le connessioni Internet.

Vedremo una descrizione teorica dei suoi membri e il tipo di dati per ciascuno di essi. Impareremo come creare un Sockaddr_in Struttura e quindi recuperare, convertire e memorizzare gli indirizzi in questo tipo di struttura per stabilire una connessione socket di successo.

Spiegheremo anche le somiglianze con la struttura Sockaddr e come convertire i dati da uno all'altro, poiché questo è un passaggio necessario per utilizzare la funzione Connect () e connetterci al server.

Sintassi della struttura Sockaddr_in in lingua C

struct Sockaddr_in
corto sin_family;
Short Sin_port non firmato;
struct in_addr sin_addr;
char sin_zero [8];
;

Descrizione della struttura Sockaddr_in in lingua C

Strutture di tipo Sockaddr_in hanno lo scopo di archiviare l'indirizzo del server nelle connessioni Internet ed essere compatibili per dimensioni e ordine di dati con una struttura Sockaddr utilizzata dalla funzione Connect () per connettersi a un server.

I dati archiviati in queste strutture specificano la famiglia degli indirizzi, il numero di porta e l'indirizzo IP del server. Successivamente, vediamo l'elenco dei membri del Sockaddr_in struttura e una descrizione di ciascun membro:

sin_family: Questo è un breve che specifica il tipo di famiglia di indirizzi che la struttura contiene. Queste opzioni di famiglia di indirizzi sono le seguenti:

Af_inet: Specifica la famiglia di indirizzi IPv4.

Af_inet6: Specifica la famiglia di indirizzi IPv6.

sin_port: è un ushort che specifica il numero di porta che la presa utilizzerà. Come gli indirizzi, il numero di porta non è codificato, il che significa che deve essere specificato in formato binario diretto, quindi una conversione in questo tipo di dati deve essere eseguita per assegnare un valore ad esso.

in_add: Questa è una struttura il cui membro è un uint32_t Laddove ciascuno dei suoi 4 byte corrisponde a un campo dell'indirizzo IPv4 del server Internet con cui la presa deve essere aperta. Come il numero di porta, l'indirizzo in questa struttura deve essere specificato in formato binario puro.

sin_zero: Questo è un array di 8 caratteri il cui unico scopo è bilanciare le dimensioni della struttura con una struttura di tipo Sockaddr.

Come dichiarare una struttura Sockaddr_in nella lingua C

Per dichiarare a Sockaddr_in struttura, scrivi in ​​una riga di codice "strumento"Seguito dal tipo. In questo caso, Sockaddr_in e poi il "Nome della struttura" O "* Nome struttura"Per dichiarare il puntatore. La sintassi per dichiarare a Sockaddr_in La struttura è la seguente:

struct Sockaddr_in *my_struct;

Come impostare il numero di porta in una struttura Sockaddr_in nella lingua C

Il numero di porta deve essere specificato in forma binaria diretta nel membro SIN_PORT della struttura. Pertanto, è necessario convertire il valore in questo tipo di dati.

IL htons () La funzione è più comunemente usata a questo scopo. Converte il valore intero contenuto nel suo argomento di input e restituisce il suo valore in formato binario diretto al suo output.

Successivamente, vediamo come assegnare la porta 80 al sin_port Membro della struttura precedentemente dichiarata:

int port = 80;
my_struct.sin_port = htons (porta);

Come impostare l'indirizzo IP in una struttura Sockaddr_in nella lingua C

Gli indirizzi IP non sono codificati, il che significa che ciascuno dei numeri nei loro campi è rappresentato dal suo equivalente binario. Per lavorare con loro, in alcuni casi è necessario convertire gli indirizzi IP in stringhe o stringhe sugli indirizzi IP al fine di assegnare o interrogare questi valori nelle strutture.

La lingua C fornisce diverse funzioni per convertire le stringhe in indirizzi e archiviare il risultato in determinate strutture.

IL funzione inet_pton () è uno dei più comunemente usati a questo scopo. È definito nell'intestazione "Inet.H"E ha tre argomenti di input. Il primo deve specificare la famiglia degli indirizzi da convertire, in questo caso Af _inet.

Il secondo argomento deve essere il puntatore a una stringa che specifica l'indirizzo IP, con ciascun campo separato da un periodo.

Il terzo argomento di questa funzione deve essere il puntatore a una struttura di tipo Sockaddr_in dove viene memorizzato l'indirizzo convertito.

IL inet_ntop () La funzione esegue l'attività inversa, convertendo gli indirizzi memorizzati in a Sockaddr_in struttura in stringhe.

Successivamente, vedremo come assegnare un indirizzo IP alla struttura My_Struct del Sockaddr_in Digita da una stringa, in questo caso ADDR, usando il inet_pton () funzione. Quindi, usiamo il inet_ntop () funzione per convertire l'indirizzo di nuovo su String IP per visualizzarlo nella console di comando con printf ().

#includere
#includere
#includere
#includere
void main ()

char ip [inet_addrstrlen] = "";
char addr [200] = "192.168.1.1 ";
struct Sockaddr_in *my_struct;
// converte la stringa in indirizzo.
inet_pton (af_inet, addr e my_struct);
// Converte l'indirizzo in stringa.
inet_ntop (af_inet, & my_struct, ip, inet_addrstrlen);
printf ("\ n \ nip indirizzo: %s \ n \ n", ip);

La seguente immagine mostra l'indirizzo IP che abbiamo ottenuto dalla stringa ADDR. Quindi, siamo tornati con la funzione complementare inet_ntop () Per convertire l'indirizzo memorizzato in my_struct in una stringa per visualizzarlo nella console di comando.

Come determinare l'indirizzo IP di un dominio e memorizzarlo in una struttura Sockaddr_in in lingua C

Per connettersi a un host, devi prima conoscere il suo indirizzo. Successivamente, diamo un'occhiata a come ottenere l'indirizzo IP di un host e archivialo in un Sockaddr_in struttura usando il gethostByName () funzione.

Questa funzione prende come unico argomento di input una stringa, o un puntatore ad essa, che specifica il nome host il cui indirizzo deve essere determinato. Di conseguenza, gethostByName () Restituisce una struttura di tipo Hostent con tutti i dati del dominio, incluso l'indirizzo IP.

Una volta recuperate le informazioni host nella struttura dell'ospite, l'indirizzo ottenuto viene copiato a Sockaddr_in struttura usando il funzione bcopy ().

Successivamente, vediamo il codice in cui il SOCADDR_IN e le strutture di tipo Hostent sono definite. IL IP indirizzo di "www.Google.com"È determinato nell'ultima struttura e copiato a Sockaddr_in struttura. Quindi, l'indirizzo determinato viene convertito in una stringa usando il inet_ntoa () e printf () funziona e visualizzato nella console di comando:

#includere
#includere
#includere
#includere
#includere
int main ()
struct Sockaddr_in my_struct;
struct hostent *host_ent;
host_ent = gethostByName ("www.Google.com ");
bcopy ((char *) host_ent-> h_addr, (char *) e my_struct.sin_addr.s_addr,
sizeof (host_ent-> h_length));
printf ("Indirizzo IP: %s \ n", inet_ntoa (my_struct.sin_addr));

In questo modo, abbiamo già archiviato l'indirizzo di "www.Google.com"Nella struttura del tipo Sockaddr_in. La figura seguente mostra l'indirizzo dell'host specificato nell'argomento di input del gethostByName () funzione.

Google.com ha più indirizzi IP associati al dominio, quindi il risultato di questo codice può differire dal risultato dell'immagine.

Come lanciare una struttura Sockaddr con i dati da una struttura Sockaddr_in

IL Collegare() La funzione è l'unica funzione fornita dal linguaggio C per stabilire connessioni socket. Questa funzione utilizza strutture di tipo Sockaddr Per specificare l'indirizzo a cui vuole connettersi.

La struttura utilizzata dal file Collegare() La funzione ha le stesse dimensioni nei byte di una struttura di tipo Sockaddr_in ma differisce nel tipo di dati. Ciò significa che una struttura lancio deve essere eseguito per utilizzare i dati di connessione archiviati in Sockaddr_in struttura in questa funzione.

Questa semplice operazione può essere eseguita con la stessa chiamata a funzione connect () Nel secondo argomento di input, come mostrato di seguito:

connect (socket, (struct sockaddr *) & my_struct, sizeof (my_struct));

Conclusione

In questo Articolo di Linux suggerimenti, Abbiamo spiegato tutto ciò che devi sapere sul lavoro con strutture di tipo Sockaddr_in. Abbiamo guardato in dettaglio il tipo e i dati di ciascuno dei suoi membri.

Ti abbiamo anche mostrato come dichiarare questo tipo di struttura e come utilizzare le funzioni necessarie per ottenere, convertire e manipolare i diversi dati memorizzati da ciascuno dei suoi membri.

Per ulteriori articoli sulla lingua C e sui suggerimenti Linux, utilizzare il motore di ricerca sul nostro sito Web.