Forse non tutti sanno che l’ordine di lettura dei byte non è fissato (wiki).
Le diverse architetture dei calcolatori hanno un modo differente di leggere dati di dimensione superiore al byte: la cosa fondamentale è che puo’ cambiare l’ordine in cui diversi byte consecutivi vengono memorizzati.
Big endian è il caso in cui le posizioni di memoria sono occupate a partire dal byte piu’ significativo (a sinistra) (Mac, per esempio, usa questo modo).
Little endian è il caso in cui le posizioni di memoria partono dal byte piu’ a destra (Intel).
Esempio:
Se vogliamo memorizzare la stringa ABCD, e la localizziamo all’indirizzo di memoria 100, in big endian avremo A al 100, B al 101, C al 102, D al 103; mentre in little endian avremo D al 100, C al 101, B al 102 e A al 103.
Ovviamente questo problema diventa immenso quando si inseriesce come stringa un numero (ad esempio una porta): 1234 puo’ diventare 4321 con effetti assai diversi.
Il formato di rete dei byte, o network byte order, è big endian; per questo è necessario convertire i valori numerici degli ip e delle porte in big endian – per fare questo ci vengono in soccorso le funzioni htonl (per i long int) e htons (per gli short). Ad esempio nel definire la struttura dell’indirizzo abbiamo:
struct sockaddr_in sa; sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.s_addr = htonl(INADDR_ANY);
In generale un socket di rete è un tubo tra due processi (ie: client – server) col quale ciascuno dei due processi puo’ interagire (leggere, scrivere, ecc.).
Il prototipo per creare un socket in C è il seguente:
int socket (int domain, int type, int prot)
Il parametro domain indica la famiglia da usare (AF_INET, AF_INET6, AF_UNIX), il type definisce la comunicazione (tcp, upd: SOCK_STREAM, SOCK_DGRAM) e protocol definisce un particolare protocollo (generalmente vale 0).
Il socket da solo non vale niente (allocca le strutture necessarie nel kernel); è quindi necessario fornire gli indirizzi secondo strutture di dati prestabilite (in sys/socket.h):
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
}
La struttura è volutamente generica: le funzioni che usano gli indirizzi hanno nel prototipo un puntatore alla struttura, e necessitano di un casting (del puntatore) per farsi capire dal protocollo voluto.
Gli indirizzi IPv4 seguono la seguente struttura:
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
}
e la struttura in_addr (che contiene l’IPv4 di 32 bit) risulta:
struct in_addr
{
u_int32_t s_addr;
}
Le strutture IPv6 e per indirizzi locali hanno alcuni campi specifici.
Poiche’ qualcuno, piu’ o meno giustamente, mi addita ancora come un game-geek… ![]()
Sleggiucchiando qua e là a proposito di programmazione in C e altro mi sono imbattuto in Sandy White e il suo Ant Attack.
Tra i «veri programmatori» occorrerebbe menzionare l’inglese Sandy White, che scrisse nel 1983 il primo videogame in proiezione isometrica, 3D_Ant_Attack 3D, per il Sinclair ZX Spectrum in puro assembler Zilog Z80 e Basic Spectrum, utilizzando solo carta e matita; solo dopo aver accuratamente completato il lavoro su carta, assemblò “a mano” il lavoro ed immise i codici esadecimali direttamente in memoria.
(da wiki)
Questo foglio:

non ha prezzo.
graphics were designed on squared paper, each filled square taken as a binary 1, each empty square as 0, converted into hex and then typed in. These are original drawings for the boy (in striding pose). It’s quite difficult to make anything recognisable with only 16 x 16 pixels – the grenade on his his belt is only one pixel!
Stupendo.
Il perche’ Il Creatore (comunque lo vogliate chiamare) abbia inventato la nebbia, non lo so.
Comunque so per certo che ci deve essere qualcosa che non gli piace nella terra fra Ferrara e Rovigo…
O_o
Almeno qualche pistolotto che sfrutta i socket in C (e le struct) è venuto fuori… figata notevole. ^_^
$ man 7 ip $ man socket $ man bind / listen / connect $ man accept / send /recv
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_15.html