Отправка в сеть структур данных с полями переменной длины
От: Аноним  
Дата: 06.05.09 05:08
Оценка:
Доброго времени суток.

Есть задача реализовать некоторый протокол, в котором имеются определённые структуры данных. Эти структуры необходимо передавать по сети. Приведу пример структур:

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.


Ситуация со структурами, содержащими поля переменной длины вполне типичная при реализации различных протоколов... Хотелось бы услышать советы и рекомендации, как необходимо организовывать структуры и/или отправку этих структур, чтобы избежать описанной выше проблемы.

Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.