Kiedy wysyłam zmienną całkowitą z jednego procesu do innego przez gniazdo, a następnie drukowanie wartości na odebranym końcu, wartość jest wciąż taka sama bez użycia ntohl/htonl, to gdzie Muszę używać tych funkcji innych niż inicjowanie struktur gniazd. Rozumiem Litte/Big Endian. Ale dlaczego musimy konwertować numery portów i adresów IP na kolejność bajtów host/sieć, gdy wartość pozostaje taka sama. Proszę wyjaśnić szczegółowo, w jaki sposób liczba całkowita jest przesyłana przez sieć?Zamieszanie w htons- little endian/big endian
Odpowiedz
Jeśli chcesz, aby program był przenośny, to za każdym razem wysyłać liczbę całkowitą większą niż 1 bajt wielkości w sieci, należy najpierw przekonwertować go do sieci kolejność bajtów używając htons
lub htonl
, a komputer odbierający musi konwertować do hostowania kolejności bajtów przy użyciu ntohs
lub.
W twoim przypadku powodem, dla którego wartość jest wciąż ta sama, jest prawdopodobnie ta sama właściwość, co komputer wysyłający i komputer odbierający. Innymi słowy, komputer wysyłający i komputer odbiorczy, z którymi pracujesz, są małymi endianami (lub dużymi endianami, niezależnie od przypadku).
Ale jeśli chcesz, aby twój program był przenośny, nie możesz polegaj na tym, aby zawsze tak było. Na przykład komputer wysyłający może być na przykład komputerem z procesorem Intel x86, a odbiorcą może być Sun SPARC, a program zakończy się niepowodzeniem, jeśli nie zostanie użyty kod htons
.
Jeśli chcesz przesłać dane z maszyny x86 lub amd64 na maszynę z procesorem PowerPC, w formacie binarnym szybko zobaczysz, że twoje dane napotykają problem "NUXI", ponieważ różne procesory traktują liczby całkowite w inny sposób i wydają się zamieniać bajty. (W rzeczywistości nie zamieniają one bajtów - po prostu pracują z nimi w innej kolejności).
Podczas pracy na x86 lub amd64, najmniej znaczący bajt jest na pierwszym miejscu w pamięci (w ten sposób można wykonać dodawanie z niższe do wyższych adresów pamięci). PowerPC umieszcza najbardziej znaczący bajt w pamięci (w ten sposób możesz sortować liczby na podstawie bajtów, które pojawiają się wcześniej w pamięci - sortowanie ciągów i sortowanie całkowite mogą być dokładnie takie same.)
To remaimns tak samo, ponieważ w Twojej architekturze kolejność sieci jest taka sama jak kolejność natywna. Jeśli nigdy nie spodziewasz się skompilowania kodu do innej architektury, możesz pominąć wywołania hton/ntoh. Twój kod nie byłby przenośny.
To nie jest poprawne. Mógłby też używać architektury, w której kolejność hostów jest inna niż kolejność sieci. Twój kod będzie "działał" bez htonX/ntohX za każdym razem, gdy architektura obu punktów końcowych ma tę samą wartość końcową. –
Masz rację - chciałem powiedzieć coś takiego, ale nie było to jasne w mojej odpowiedzi. –
Napisałem klienta i serwer i nie używałem htonl i ntohl. Powiedz, kiedy wysłałem 6, serwer otrzymał 6 wartości. Więc jaka jest potrzeba tych funkcji? – avd
Potrzeba tych funkcji ma miejsce, gdy klient działa na małym endianinem, a serwer działa na dużym endiandzie i na odwrót. –
Co z nieczęstymi typami danych, takimi jak structs? Czy oni mają endianess? –