Domanda

Quando invio un intero variabile da un processo all'altro attraverso presa, e quindi stampando il valore alla fine ricevuto, il valore è ancora la stessa senza utilizzare ntohl / htonl, allora dove ho bisogno di usare queste funzioni diverse inizializzazione strutture presa. Capisco litte big endian /. Ma perché abbiamo bisogno di convertire porto e IP nos ad ospitare byte order / rete quando il valore rimane lo stesso. Si prega di spiegare in dettaglio come il numero intero si trasferì sulla rete?

È stato utile?

Soluzione

Se si desidera che il programma sia portatile, quindi ogni volta che si invia un numero intero maggiore di 1 byte di dimensioni attraverso la rete, è necessario prima convertirlo in rete al fine di byte utilizzando htons o htonl, e il computer ricevente deve convertirlo per ospitare ordine di byte utilizzando ntohs o ntohl.

Nel tuo caso, il motivo per il valore è ancora lo stesso è probabilmente perché il computer che invia e computer ricevente sono dello stesso endianness. In altre parole, il computer che invia e il computer ricevente si sta lavorando sono sia little endian (o big endian, qualunque sia il caso.)

Ma se si desidera che il programma sia portatile, non si può contare su questo per essere sempre il caso. Un giorno, per esempio, il computer che invia può essere un Intel x86, e il ricevente può essere uno SPARC di Sun, e quindi il vostro programma fallirà se non si utilizza htons.

Altri suggerimenti

Se si desidera inviare i dati da una macchina x86 o amd64 ad una macchina con processore PowerPC, in formato binario rapidamente vedrai che i dati incontra il "problema Nuxi", come il diverso trasformatori trattano gli interi diverso e sembrano scambiare i byte. (In realtà non scambiare i byte -. Semplicemente lavorare con loro in un ordine diverso)

Quando si lavora su x86 o amd64, il byte meno significativo viene prima nella memoria (in questo modo è possibile eseguire oltre dal più basso al più alto indirizzi di memoria). Il PowerPC pone il byte più significativo prima nella memoria (in questo modo è possibile ordinare i numeri in base ai byte che arrivano in precedenza nella memoria -. Una stringa sorta e un intero ordinamento può essere esattamente lo stesso)

E 'remaimns lo stesso perché della vostra architettura l'ordine di rete è lo stesso che l'ordine nativo. Se non avete mai anticipare compilazione del codice per un altro architettura si poteva omettere le chiamate ntoh / hton. Il tuo codice quindi, potrebbero non essere portabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top