Преобразование порядка байтов htonl и htons

Я новичок в программировании сокетов, и я пришел к этим механизмам преобразования сетевых байтов, методам htons и htonl.
В документации сказано, что они преобразуют либо 16-битный, либо 32-битный номер сети из порядка байтов сети хоста в порядок байтов в Интернете
так что же происходит, когда хост и сеть используют один и тот же порядок байтов
и как вы определяете, следует ли вам их использовать или нет?

С уважением


person shaddyshad    schedule 23.10.2016    source источник


Ответы (2)


Они могут ничего не делать, если это в том же порядке. Если наоборот, то поменяется. Всегда используйте их для транспортировки. Оба конца поймут

person Ed Heal    schedule 23.10.2016

Сетевой порядок байтов имеет обратный порядок байтов. Функции hton...() и ntoh...() фактически не выполняют операций на машине с прямым порядком байтов и обменивают байты на машине с прямым порядком байтов. Если сетевой протокол, который вы реализуете, передает числа в сетевом порядке байтов, вы всегда должны вызывать функции независимо от платформы. Таким образом, все исходящие номера гарантированно будут преобразованы из локального в прямой, а все входящие номера будут преобразованы из прямого в локальный.

person Remy Lebeau    schedule 25.10.2016
comment
можно ли проверить endianness вашего хоста? И если да, то как это сделать, и нужно ли вообще знать - person shaddyshad; 25.10.2016
comment
@void_shad это технически возможно (и для этого существует множество примеров кода), но в этой ситуации это не обязательно и на самом деле ничего вам не даст. Вся локальная обработка должна выполняться с использованием локального порядка байтов, каким бы он ни был. Компилятор позаботится об этом за вас. Преобразовывать endian только во время передачи/приема, и именно здесь в игру вступают функции преобразования. Если обе стороны играют по этим правилам, значение 12345 все равно будет равно 12345 на другом конце, даже если обе стороны используют разные порядковые номера платформ. - person Remy Lebeau; 25.10.2016