2009-11-05 2 views
9

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

ответ

16

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

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

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

+0

Я написал клиент и сервер и не использовал htonl и ntohl. Скажем, когда я отправил 6, сервер получил 6 значений. Тогда в чем же нуждаются эти функции? – avd

+5

Необходимость этих функций заключается в том, что клиент работает на компьютере с маленьким контентом, а сервер работает на большом конце, или наоборот. –

+0

О нецелых типах данных, таких как structs? Есть ли у них энтузиазм? –

9

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

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

0

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

+1

Неправильное использование. Он вполне мог бы использовать архитектуру, где порядок хоста отличается от порядка сети. Ваш код будет «работать» без htonX/ntohX всякий раз, когда архитектура обоих конечных точек имеет одинаковую endianess. –

+0

Вы правы - я собирался сказать что-то подобное, но в моем ответе было не очень понятно. –

Смежные вопросы