C ++ Порядок байтов в программировании сокетов - PullRequest
3 голосов
/ 30 июня 2011

В C ++ мы отправляем данные, используя сокет в сети. Я знаю, что нам нужно использовать функции htons () , ntohs () для поддержания порядка байтов с прямым порядком байтов и с прямым порядком байтов .

поддержка у нас есть следующие данные для отправки

int roll;
int id;
char name[100];

Это также может быть включено в struct.

Моя путаница заключается в том, что для roll и id мы можем использовать функцию htons () . Но что касается строки name , что и как мы должны это сделать? Нужно ли нам использовать любую такую ​​функцию? это будет работать на каждой машине, как Mac, Intel и другие сети?

Я хочу отправить все три поля в одном пакете.

Ответы [ 3 ]

6 голосов
/ 30 июня 2011

Вы бы использовали htonl для int, а не htons.

Имя не нужно переупорядочивать, поскольку байты массива соответствуют непосредственно байтам в сети.

Проблема порядка байтов возникает только со словами больше байта, так как разные архитектуры выбирают разные концы для размещения младшего байта.

1 голос
/ 30 июня 2011

Для массивов символов это преобразование не требуется, поскольку они не имеют сетевого порядка байтов, но передаются последовательно.Причина существования ntohs и htons заключается в том, что некоторые типы данных состоят из младших и более значимых битов, которые по-разному интерпретируются в разных архитектурах.Это не относится к строкам.

0 голосов
/ 30 июня 2011

Чтобы добавить к полезным комментариям здесь - если ваши структуры становятся намного более сложными, вам может быть лучше рассмотреть библиотеку сериализации, такую ​​как Boost.Serialization или Буферы протокола Google , которые обрабатывают последовательность для вас под одеялом.

При кодировании строки убедитесь, что вы отправляете длину (вероятно, short, обработанную с использованием htons) перед самой строкой, а не просто отправляйте 100 символов каждый раз.

...