Если вы против сериализации текста и действительно хотите структуру, то делайте это, как и большинство сетевых протоколов, с «хостом в сеть» при отправке и «сетью в хост» при получении всех полей в структуре.Идея состоит в том, что все отправители, независимо от того, какой порядок байтов они всегда переводят в сеть (big-endian, я забыл, что есть какой).Затем все получатели преобразуются в то, чем они являются (может быть также с прямым порядком байтов, который не меняется).
Уже есть apis для этого.Это ntohs (сеть для размещения коротких 16-битных полей) и ntohl (32-битные поля).Тогда, конечно, htons и htonl.
Итак, для такой структуры:
typedef struct
{
unsigned char stuff1;
unsigned char stuff2;
unsigned short stuff3;
unsigned int stuff4;
}tFoo;
Код отправки будет выглядеть примерно так:
tFoo to_send;
to_send.stuff1 = local_stuff1;
to_send.stuff2 = local_stuff2;
to_send.stuff3 = htons(local_stuff3);
to_send.stuff4 = htonl(local_stuff4);
Код получения будетсделать что-то вроде:
local_stuff3 = ntohs(from.stuff3);
local_stuff4 = ntohl(from.stuff4);
Обратите внимание, что упаковка / выравнивание имеет значение для структуры.Вы должны быть утомлены выравниванием, которое не всегда одинаково для разных компиляторов и даже для одного и того же компилятора.Он может даже изменить для самих типов данных (тип int может быть разного размера от арки к арке).Я попытался продемонстрировать это с помощью первых двух 8-битных символов, за которыми следуют 16-битный и 32-битный, что в сумме составляет 8 байт.Вы должны быть уверены, что при переносе на другой компилятор / арку вы действительно получаете правильную упаковку / размер.
По этой причине большинство людей выбирают сериализацию и, вероятно, почему большинство людей ответили именно так.Это наименее подвержен ошибкам.
Удачи.