Здравствуйте, LeXa-XL, Вы писали:
LX>можно немного по подробнее о :
LX>#pragma pack(push,1)
LX>struct {
LX> unsigned long id;
LX> unsigned long size;
LX> unsigned long type;
LX> char name[32];
LX> char addr[16];
LX> unsigned long p;
LX>} data;
LX>#pragma pack(pop)
LX>не совсем понятно как данная структура преобразуется в const char *buff
LX>что делает #pragma pack(push,1)?
Даная прагма делает выравнивание даных побайтовое, поэтому ты смело можеш преобразовать к char *, прагма делать текущим выравнивание на границу одного байта, то есть каждое поле идёт строго одно за другим, а старое значение выравнивания, обычно 4 заталкивает в стек, прагма поп просто возвращает старое значение выравнивания. И обнулить память не забудь, а то иногда можно получить непредсказуемые результаты.
LX>а если много подобных, но разных структур, то между push и pop надо просто добавить описание этих структур?
Желательно обрамлять прагмами только структуры которые нужно пересылать через сеть, так как байтовое выравнивание очень плохо сказывается на производительности.
LX>Я так понимаю, если есть много типов структур data1, data2, data3 и т.д., то необходимо добавить в каждую из них дополнительную информацию о типе данных и размере всей структуры, чтобы принимающая сторона могла успешно их идентифицировать?
Если передаются разные структуры или/и разной длины то да, если же все одинаковые то не обязательно.