C socket API
client
server
Le API per l’uso di socket in C comprendono
Definizione di tipi di dati (indirizzi IP, indirizzi di socket)
Funzioni di utilità (conversione dati, risoluzione dei nomi DNS)
Funzioni per la gestione dei socket (creazione, connessione)
I socket non sono solo relativi ai protocolli TCP o UDP su IP
Si possono specificare la famiglia e il tipo di protocollo
Sono possibili modalità con connessione (es. TCP) che senza connessione (es. UDP)
E’ un meccanismo più generale per la comunicazione interprocesso che può essere basato su soluzioni di tipo diverso (es. memoria condivisa per
processi in locale)
Process Socket API
Tranport Layer Protocol
OS
Process Socket
API
Tranport Layer Protocol
OS
communication channel
00001010 00010111 00001110 00000110
00001010 00010111 00001110 00000110
MSB LSB
00001010 00010111 00001110 00000110
A A+1 A+2 A+3
A A+1 A+2 A+3
big-endian little-endian
Sono disponibili funzioni per la conversione dal formato dell’host a quello di rete (big-endian)
Se il formato per l’architettura su cui è eseguita è già big-endian, la funzione non altera l’ingresso, altrimenti scambia l’ordine dei byte
u_short htons(u_short host_short)
u_short ntohs(u_short network_short)
u_long htonl(u_long host_long)
u_long ntohl(u_long network_long)
Esempio: conversione dell’indirizzo di porta (u_short) e IP (u_long) addr.sin_port = htons((u_short)4321);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
Conversione da rappresentazione ASCII decimale a binario a 32 bit
int inet_aton(const char *strptr, struct in_addr *addrptr)
produce un valore uguale a 0 se la stringa non è un indirizzo IP nel formato corretto (>0 se la conversione avviene con successo)
if(!inet_aton(“193.205.7.1”, &addr)) {..error..}!
char *inet_ntoa(struct in_addr inaddr)
Funzione di conversione da nome DNS ad indirizzo IP
struct hostent *gethostbyname(const char *hostname)
E’ una chiamata al resolver DNS
La struttura prodotta contiene numerose informazioni sull’host