Я пытаюсь новый сокет программирования C ++. У меня возникли трудности с пониманием функциональности htons, htonl и связанных с ними функций. Я прочитал некоторые документы, но мои вопросы таковы:
для одного сервера и одного клиента я использую htons для номера порта, и код работает нормально. Даже если я не использую эти функции и оба моих сервера-клиента работают на 64-битных машинах на базе Intel, коды работают нормально. Но что, если несколько клиентов пытаются подключить мой сервер, и клиенты используют другой формат хранения данных. Например, x86 является прямым порядком байтов, а ARM A-53 — как младшим, так и старшим порядком, а другие — 32-битными, 16-битными или 64-битными и т. Д. Мой сервер 64-битный. Так что я теперь запутался, какие функции я должен использовать, чтобы единообразно служил всем целям? Или я должен всегда определять тип клиента и преобразовывать его формат данных (номер порта) в 64-битный (так как мой сервер 64-битный), а затем использовать функцию htonl () для доступа к серверу. Было бы здорово, если кто-то ответит или укажет мне, если я на неправильном пути …
Хорошо, что ты задаешь вопрос. Это показывает, что вы беспокоитесь о правильных вещах.
Документация здесь:
http://linux.die.net/man/3/htonl
обратите внимание, что аргументы и возвращаемые типы имеют определенные размеры независимо от того, в какой системе вы находитесь.
Эти функции конвертируют из и в сетевой порядок байтов (что на самом деле является прямым порядком байтов). Независимо от того, какую архитектуру вы программируете, они выполнят эту задачу (если вы используете архитектуру с прямым порядком байтов, это будет просто запрет).
Следовательно, их использование сделает код переносимым. Обратите внимание, что вы не должны использовать htonl
при обоих преобразованиях. Когда вы отправляете данные на другой хост, который вы используете htonl
(хост к порядку байтов сети) перед отправкой данных, а затем ntohl
(сеть для размещения байтов), когда вы получаете.
Обратите внимание, что ntohl
а также htonl
не гарантируется (хотя я не могу привести пример), чтобы быть одинаковыми, и поэтому вы должны использовать правильный.