Socket Unix - Strutture

Varie strutture sono utilizzate nella programmazione Unix Socket per contenere informazioni sull'indirizzo e sulla porta e altre informazioni. La maggior parte delle funzioni socket richiede un puntatore a una struttura di indirizzi socket come argomento. Le strutture definite in questo capitolo sono correlate alla famiglia di protocolli Internet.

sockaddr

La prima struttura è sockaddr che contiene le informazioni sul socket -

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

Questa è una struttura di indirizzi socket generica, che verrà passata nella maggior parte delle chiamate di funzione socket. La tabella seguente fornisce una descrizione dei campi dei membri:

Attributo Valori Descrizione
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Rappresenta una famiglia di indirizzi. Nella maggior parte delle applicazioni basate su Internet, utilizziamo AF_INET.
sa_data Indirizzo specifico del protocollo Il contenuto dei 14 byte dell'indirizzo specifico del protocollo viene interpretato in base al tipo di indirizzo. Per la famiglia Internet, useremo l'indirizzo IP del numero di porta, che è rappresentato dalla struttura sockaddr_in definita di seguito.

sockaddr in

La seconda struttura che ti aiuta a fare riferimento agli elementi del socket è la seguente:

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

Ecco la descrizione dei campi dei membri:

Attributo Valori Descrizione
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Rappresenta una famiglia di indirizzi. Nella maggior parte delle applicazioni basate su Internet, utilizziamo AF_INET.
sin_port Porta di servizio Un numero di porta a 16 bit in Network Byte Order.
sin_addr Indirizzo IP Un indirizzo IP a 32 bit in Network Byte Order.
sin_zero Non usato È sufficiente impostare questo valore su NULL poiché non viene utilizzato.

in addr

Questa struttura viene utilizzata solo nella struttura sopra come un campo struttura e contiene netid / hostid a 32 bit.

struct in_addr {
   unsigned long s_addr;
};

Ecco la descrizione dei campi dei membri:

Attributo Valori Descrizione
s_addr porta di servizio Un indirizzo IP a 32 bit in Network Byte Order.

hostent

Questa struttura viene utilizzata per conservare le informazioni relative all'host.

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

Ecco la descrizione dei campi dei membri:

Attributo Valori Descrizione
h_name ti.com ecc. È il nome ufficiale dell'ospite. Ad esempio, tutorialspoint.com, google.com, ecc.
h_aliases TI Contiene un elenco di alias del nome host.
h_addrtype AF_INET Contiene la famiglia di indirizzi e, in caso di applicazione basata su Internet, sarà sempre AF_INET.
h_length 4 Contiene la lunghezza dell'indirizzo IP, che è 4 per l'indirizzo Internet.
h_addr_list in_addr Per gli indirizzi Internet, l'array di puntatori h_addr_list [0], h_addr_list [1] e così via sono punti alla struttura in_addr.

NOTE - h_addr è definito come h_addr_list [0] per mantenere la compatibilità con le versioni precedenti.

servo

Questa particolare struttura viene utilizzata per conservare le informazioni relative al servizio e alle porte associate.

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

Ecco la descrizione dei campi dei membri:

Attributo Valori Descrizione
s_name http Questo è il nome ufficiale del servizio. Ad esempio, SMTP, FTP POP3, ecc.
s_aliases ALIAS Contiene l'elenco degli alias di servizio. La maggior parte delle volte sarà impostato su NULL.
sport 80 Avrà un numero di porta associato. Ad esempio, per HTTP, questo sarà 80.
s_proto

TCP

UDP

È impostato sul protocollo utilizzato. I servizi Internet vengono forniti utilizzando TCP o UDP.

Suggerimenti sulle strutture socket

Le strutture degli indirizzi socket sono parte integrante di ogni programma di rete. Li allochiamo, li riempiamo e passiamo loro dei puntatori a varie funzioni socket. A volte passiamo un puntatore a una di queste strutture a una funzione socket e riempie il contenuto.

Passiamo sempre queste strutture per riferimento (ovvero, passiamo un puntatore alla struttura, non alla struttura stessa) e passiamo sempre la dimensione della struttura come un altro argomento.

Quando una funzione socket riempie una struttura, anche la lunghezza viene passata per riferimento, in modo che il suo valore possa essere aggiornato dalla funzione. Chiamiamo questi argomenti valore-risultato.

Sempre, imposta le variabili di struttura su NULL (cioè, '\ 0') usando memset () per le funzioni bzero (), altrimenti potrebbe ottenere valori spazzatura imprevisti nella tua struttura.