jump to navigation

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: , , , , ,
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…..

Annunci

Commenti»

1. Kazhaar - 5 luglio 2008

Grazie capo!


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: