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.