Гнездо для записи little endian - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующие 4-байтовые выровненные данные структуры (без заполнения), которые копируются в неподписанный буфер char * перед отправкой через сокет TCP.Машина-отправитель - это система с прямым порядком байтов, а система-получатель - это система с прямым порядком байтов.

typedef struct {
    unsigned short  a;
    unsigned short  b;
} Struct;
Struct s;
s.a = 1;
s.b = 2;
...
memmcpy (buf, (unsigned char *)&s, sizeof (Struct));
write (sockfd, buf, sizeof(Struct));

В системе отправителя я представляю, что sa будет представлен в памяти как 01 00 и sb 02 00, таким образом, поток, который отправляется, является 01 00 02 00. Я предполагаю, что в этом случаеотправитель отправляет байтовый порядок с прямым порядком байтов по сети, а не сетевой порядок байтов.

Так как получатель является системой Big Endian, мой вопрос:

  1. Отправитель должен отправить в сетевом порядке байтов (должен вызвать htons на sa и sb)
  2. Или получатель должен обработать это, вызвав ntohs?

1 Ответ

0 голосов
/ 29 мая 2018

На этот вопрос нет однозначного ответа, и существуют прецеденты для обоих:

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

  • CORBA IIOP отправляет в байтовом порядке хоста вместе с флагом, чтобы указать, какой порядок это -клиенты должны иметь возможность поменять порядковый номер, если флаг отличается от их собственного собственного порядка.

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

...