Re[3]: Как переслать структуру с помощью сокетов
От: Stoune  
Дата: 06.04.05 12:59
Оценка:
Здравствуйте, 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 и т.д., то необходимо добавить в каждую из них дополнительную информацию о типе данных и размере всей структуры, чтобы принимающая сторона могла успешно их идентифицировать?


Если передаются разные структуры или/и разной длины то да, если же все одинаковые то не обязательно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.