Когда я отправляю целочисленную переменную из одного процесса в другой через сокет, а затем печатаю значение на полученном конце, значение остается неизменным без использования ntohl/htonl, тогда где Мне нужно использовать эти функции, кроме инициализации структур сокетов. Я понимаю litte/big endian. Но почему нам нужно преобразовывать порты и IP-адреса в хост/сетевой порядок байтов, когда значение остается неизменным. Пожалуйста, объясните подробно, как целое число передается по сети?Путаница в htons-little endian/big endian
ответ
Если вы хотите, чтобы ваша программа была переносимой, то в любое время, когда вы отправляете целое число размером более 1 байт по сети, вы должны сначала преобразовать его в сетевой порядок байтов, используя htons
или htonl
, а принимающий компьютер должен преобразовать он будет размещать порядок байтов, используя ntohs
или ntohl
.
В вашем случае причина, по которой значение остается неизменным, вероятно, связано с тем, что отправляющий компьютер и принимающий компьютер имеют одинаковую контенту. Другими словами, отправляющий компьютер и принимающий компьютер, с которыми вы работаете, являются как маленькими, так и конечными (в зависимости от обстоятельств).
Но если вы хотите, чтобы ваша программа была переносной, вы не можете полагайтесь на это всегда так. Однажды, например, отправляющий компьютер может быть Intel x86, а получателем может быть Sun SPARC, а затем ваша программа потерпит неудачу, если вы не используете htons
.
Если вы хотите отправить данные из x86 или amd64 к машине с процессором PowerPC, в формате бинарного вы быстро поймете, что ваши данные сталкиваются с «проблемой NUXI», как различные процессоры обращаются с целыми числами по-разному и, по-видимому, меняют байты. (Они фактически не заменяют байты - они просто работают с ними в другом порядке.)
При работе с x86 или amd64 младший байт появляется первым в памяти (таким образом вы можете выполнить добавление из от более низких до более высоких адресов памяти). PowerPC сначала помещает самый старший байт в память (таким образом, вы можете сортировать числа на основе байтов, которые раньше были в памяти - сортировка строк и целочисленная сортировка могут быть точно такими же.)
Он восстанавливает то же самое, потому что в вашей архитектуре порядок сети такой же, как и нативный. Если вы никогда не планируете компилировать свой код для другой архитектуры, вы можете опустить вызовы hton/ntoh. Тогда ваш код не будет переносимым.
Неправильное использование. Он вполне мог бы использовать архитектуру, где порядок хоста отличается от порядка сети. Ваш код будет «работать» без htonX/ntohX всякий раз, когда архитектура обоих конечных точек имеет одинаковую endianess. –
Вы правы - я собирался сказать что-то подобное, но в моем ответе было не очень понятно. –
- 1. Путаница при интерпретации 32-битного целого числа в машинах большого числа Endian и Little Endian
- 2. Big Endian в Little Endian
- 3. big-endian && little -endian?
- 4. Маленький endian Vs Большой endian
- 5. big endian vs little endian
- 6. Мало-endian и Big-Endian
- 7. big endian little endian conversion
- 8. C Big Endian в Little Endian Структуру
- 9. Little Endian - Big Endian Проблема
- 10. Big endian and small endian confusion
- 11. Oracle RMAN big-endian to little-endian
- 12. понимание концепции маленького endian и big endian
- 13. C маленьким endian, но результат большой endian?
- 14. mmap big endian vs. little endian
- 15. Маленькая программа Endian и Big endian c
- 16. Понимание большого endian, little endian (снова)
- 17. Преобразование char из большого endian в little endian в C
- 18. Преобразование little endian в большой endian с помощью операторов Bitshift
- 19. Большой Endian и Little Endian для файлов в C++
- 20. Java - Преобразование Big Endian двоичной строки в маленький Endian
- 21. Как преобразовать значения big-endian и little-endian в C++?
- 22. Perl: Как преобразовать big endian в little endian
- 23. Преобразование большого Endian ELF исполняемого в Little Endian endianness?
- 24. Маленький endian to big endian в Groovy 2.0?
- 25. Разница между процессором big-endian и little-endian в примере
- 26. Большой Endian или Small Endian при хранении данных в Cassandra?
- 27. C++ компилятор конвертирует big-endian в little endian
- 28. Преобразование Datapump из большого endian в little endian
- 29. Как преобразовать эти данные из Little Endian в Big Endian
- 30. Путаница с маленькими конечными байтами. Как получить целое значение 1 байт в небольшой Endian
Я написал клиент и сервер и не использовал htonl и ntohl. Скажем, когда я отправил 6, сервер получил 6 значений. Тогда в чем же нуждаются эти функции? – avd
Необходимость этих функций заключается в том, что клиент работает на компьютере с маленьким контентом, а сервер работает на большом конце, или наоборот. –
О нецелых типах данных, таких как structs? Есть ли у них энтузиазм? –