C Socket Programming in the UNIX environment - part 3 21 Novembre 2007
Posted by fripp in C, GNU/Linux, Informatica, Networking, Programmazione, Sistemi Operativi, Unix.Tags: byte order, C, endianess, htonl, htons, Networking
trackback
Nella scorsa “puntata” avevo accennato al problema degli indirizzi in “network order”. Per capire che significa, occorre introdurre il concetto di endianess (o indianità, come diceva un mio prof), ovvero l’ordine con cui vengono disposti i bytes in memoria per rappresentare i dati.
Esistono due forme fondamentali di endianess:
- big endian, in cui la memorizzazione del dato inizia col byte più significativo;
- little endian, in cui la memorizzazione del dato inizia col byte meno significativo;
La codifica big endian viene utilizzata dai processori Motorola, mentre quella little endian da quelli Intel.
Il problema principale da affrontare è quello legato al passaggio dell’informazione da un sistema che usa una codifica ad un sistema che ne utilizza una completamente differente; per ovviare a questo problema la rete usa una forma standard di codifica, quella big endian, per fare in modo che tutti possano parlare nella stessa lingua. Questa scelta impone al programmatore l’uso di opportune funzioni di riordinamento tra un sistema di codifica ad un altro.
Ecco i prototipi di queste funzioni di riordinamento:
#include <arpa/inet.h> unsigned long int htonl(unsigned long int hostlong) /*Converte l’intero a 32 bit hostlong dal formato della macchina a quello della rete. */ unsigned short int htons(unsigned short int hostshort) /*Converte l’intero a 16 bit hostshort dal formato della macchina a quello della rete. */ unsigned long int ntohl(unsigned long int netlong) /*Converte l’intero a 32 bit netlong dal formato della rete a quello della macchina. */ unsigned sort int ntohs(unsigned short int netshort) /*Converte l’intero a 16 bit netshort dal formato della rete a quello della macchina.*/
I nomi di queste funzioni ad una prima impressione protrebbero sembrare casuali, ma in realtà non è per nulla così: la lettera n sta ad indicare l’ordinamento usato sulla rete (network order); la lettera h indica l’ordinamento usato sulla macchina (host order); le lettere s e l indicano il tipo di dato (s sta per short, l per long).Dopo questa precisazione risulta molto più facile ricordare i nomi di queste funzioni: se per esempio dovessi convertire un intero a 32 bit in network order userei la htonl (from host to network returning a long).Adoro i mnemonici ben riusciti!
Con le funzioni di conversione non abbiamo finito. Un altro aspetto da prender in considerazione è che la nostra cara dotted decimal notation la capiamo solo noi; quelle capre delle macchine conoscono solo bit, non ne sanno nulla della nostra notazione.
Per questo motivo esistono delle funzioni che permettono di convertire un indirizzo IP espresso in notazione puntata in un indirizzo IP comprensibile alla macchina e viceversa.
Ecco queste funzioni:
#include <arpa/inet.h> in_addr_t inet_addr(const char *strptr) /*Converte la stringa dell’indirizzo dotted decimal in nel numero IP in network order. */ int inet_aton(const char *src, struct in_addr *dest) /*Converte la stringa dell’indirizzo dotted decimal in un indirizzo IP. */ char *inet_ntoa(struct in_addr addrptr) /*Converte un indirizzo IP in una stringa dotted decimal. */
Enjoy…..















Commenti»
No comments yet — be the first.