Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Правильное формирование пакета


Автор: REZiaMIX 25.5.2008, 14:32
Задача - сформировать правильный пакет , с полями постоянной длины:

Буффер сообщения :
Код

char text  = "abc";


Есть структура:
Код

struct packetheader{
int bytes;
int packet_type;
};
packetheader head;
head.bytes = strlen(text);
head.packettype = 10;


Буффер для пакета:
Код

char * sendbuffer;
sendbuffer = (char*)malloc(sizeof(packetheader)+strlen(text));


Нужно заполнить какимто образом пакет , чтобы он выглядел следующим образом:

Размер:            4              4               strlen(text)
Структура:    [packetheader]    [             text       ] 

Если сделать таким образом:

Код

memcpy(sendbuffer,&head,sizeof(head));
memcpy(sendbuffer+sizeof(head),&text,head.bytes);


То выходит, что реальный размер head в памяти непостоянен и зависит от значений структуры.

Как правильней сформировать пакет, чтобы можно было считать 4 байта(размер сообщения text),затем 4 байта тип пакета, затем текст
в зависимости от заголовка пакета?

Автор: Sartorius 25.5.2008, 14:39
Цитата

То выходит, что реальный размер head в памяти непостоянен и зависит от значений структуры


 Это почему ты так решил? head - структура из двух int-ов. Где изменение размера?

Автор: mes 25.5.2008, 14:43
Цитата(REZiaMIX @  25.5.2008,  14:32 Найти цитируемый пост)
То выходит, что реальный размер head в памяти непостоянен и зависит от значений структуры

реальный размер head в пределах откомпилированной проги всега будет равным и от значений структуры не зависит

Автор: REZiaMIX 25.5.2008, 15:11
Хм , нашел ошибку у себя в исходнике , подправил , все работает.
Цитата

реальный размер head в пределах откомпилированной проги всега будет равным и от значений структуры не зависит

Действительно , ступил(((

 Спасибо, еще один вопрос(наверное глупый):
Если передавать эту структуру по сети и например на поле packet_type выделять только 2 байта? что произойдет?
или же как можно при условии например что число будет не более 100, уменьшить кол-во памяти занимаемое переменной?

Автор: Sartorius 25.5.2008, 15:15
Цитата

или же как можно при условии например что число будет не более 100, уменьшить кол-во памяти занимаемое переменной?

 unsigned char ом сделай. или вообще битовым полем. Семи бит будет достаточно.

Автор: mes 25.5.2008, 16:06
struct packetheader{
unsigned char bytes       :7;// итого 14 бит - но смысла нет так как выделится на структуру все равно 2 байта
unsigned char packet_type :7;// поэтому :7 не нужно
};

Добавлено через 2 минуты и 14 секунд
однако если тебе нужен тип int то можно так
struct packetheader{
int bytes            :8;
int packet_type :8;
}; итого два байта на структуру с ограниченым местом под хранение значений 

Автор: REZiaMIX 29.5.2008, 20:11
Всем спасибо за ответы , проблема решена.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)