Теперь я борюсь с программированием сокетов, и я столкнулся с проблемой, которую я не знаю, как решить переносимым образом. Задача проста: мне нужно отправить массив из 16 байтов по сети, получить его в клиентском приложении и проанализировать его. Я знаю, что есть такие функции, как htonl, htons и т. Д., Которые можно использовать с uint16 и uint32. Но что мне делать с кусками данных больше?Отправка массива произвольной длины через сокет. Endianness
спасибо.
Я немного смущен. Скажем, моя машина имеет порядок байтов младшего порядка, и я пытаюсь отправить ipv6-адрес в виде байтового массива в одном блоке по сети. Насколько я понимаю, мы должны вернуть байты (16-й станет первым), перенести их и на стороне клиента (если это тоже мало-endian) вернуть байта-ордера. Я прав? –
IPv6-адрес должен быть отправлен в виде массива в порядке big-endian. Вы должны (обычно) иметь возможность обрабатывать его как в основном непрозрачные данные - например, вы получаете 16 байт и копируете их в sockaddr_in6 точно так же, как вы их получили.Стек IP может решить поменять их внутри, но все, что вы должны видеть снаружи, будет в сетевом порядке. Когда-нибудь, если бы у вас была 128-битная машина и вы хотели загрузить ее и манипулировать ею как число, тогда вам придется беспокоиться о 'ntohlll' и' htonlll' (или о том, что получилось). –