Вопрос

Когда я отправляю целочисленную переменную из одного процесса в другой через сокет, а затем печатаю значение на полученном конце, значение остается тем же самым без использования ntohl / htonl, тогда где мне нужно использовать эти функции, кроме инициализации структур сокетов.Я понимаю литтл /биг эндиан.Но зачем нам нужно преобразовывать номера портов и IP-адресов в порядок байтов хост / сеть, когда значение остается прежним?Пожалуйста, объясните подробно, как целое число передается по сети?

Это было полезно?

Решение

Если вы хотите, чтобы ваша программа была переносимой, то каждый раз, когда вы отправляете по сети целое число размером более 1 байта, вы должны сначала преобразовать его в сетевой порядок байтов, используя htons или htonl, и принимающий компьютер должен преобразовать его в порядок байтов хоста , используя ntohs или ntohl.

В вашем случае причина, по которой значение остается тем же самым, вероятно, заключается в том, что отправляющий компьютер и принимающий компьютер имеют одинаковый порядковый номер.Другими словами, отправляющий компьютер и принимающий компьютер, с которыми вы работаете, имеют младший конечный код (или большой конечный код, в зависимости от конкретного случая).

Но если вы хотите, чтобы ваша программа была переносимой, вы не можете полагаться на то, что так будет всегда.Например, однажды отправляющим компьютером может быть Intel x86, а принимающим - Sun SPARC, и тогда ваша программа завершится сбоем, если вы не будете использовать htons.

Другие советы

Если вы хотите отправить данные с компьютера x86 или amd64 на компьютер с процессором PowerPC, в бинарный форматирование вы быстро увидите, что ваши данные сталкиваются с "проблемой NUXI", поскольку разные процессоры по-разному обрабатывают целые числа и, похоже, меняют местами байты.(На самом деле они не меняют местами байты - они просто работают с ними в другом порядке.)

При работе на x86 или amd64 младший по значению байт стоит первым в памяти (таким образом, вы можете выполнять сложение от младшего адреса памяти к старшему).PowerPC первым помещает в память наиболее значимый байт (таким образом, вы можете сортировать числа на основе байтов, которые находятся в памяти раньше - строковая сортировка и целочисленная сортировка могут быть абсолютно одинаковыми).

Это повторяет то же самое, потому что в вашей архитектуре сетевой порядок совпадает с собственным порядком.Если вы никогда не планируете компилировать свой код для другой архитектуры, вы могли бы опустить вызовы hton / ntoh.Тогда ваш код не был бы переносимым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top