Доброго времени суток.
Есть задача реализовать некоторый протокол, в котором имеются определённые структуры данных. Эти структуры необходимо передавать по сети. Приведу пример структур:
struct Struct1 {
uint8 Tag; // = 10
uint16 Length;
uint8* Data;
};
struct Command1 {
uint8 Tag; // = 1
uint16 Length;
Struct1 Data1;
};
Как видите, у некоторых структур имеются поля переменной длины.
Допустим мы инициализируем эти структуры примерно следующим образом:
Struct1 s1 = {10, sizeof(uint8) + sizeof(uint16) + sizeof(uint8) * 50, new uint8[50] };
strncpy((char*)s1.Data, "bla bla bla bla bla!", 20);
Command1 cmd1 = {1, sizeof(uint8) + sizeof(uint16) + s1.Length, s1};
Далее необходимо отправить структуру Command1 в сеть:
int res = send(sock, &cmd1, cmd1.Length, 0);
Насколько я понимаю, такая отправка не является корректной, так как мы отправляем последовательность байтов, начинающихся по адресу &cmd1 и имеющую длину cmd1.Length, но cmd1.s1.Data — это указатель, который указывает на динамическую память, которая в эту последовательность, естественно не попадает.
То есть мы вместо того, чтобы отправить строку "bla bla bla bla bla!" либо отправим какой-нибудь мусор, либо вообще рухнем по segmentation fault.
Ситуация со структурами, содержащими поля переменной длины вполне типичная при реализации различных протоколов... Хотелось бы услышать советы и рекомендации, как необходимо организовывать структуры и/или отправку этих структур, чтобы избежать описанной выше проблемы.
Заранее спасибо.