Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильное формирование пакета 
V
    Опции темы
REZiaMIX
Дата 25.5.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



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

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

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 байта тип пакета, затем текст
в зависимости от заголовка пакета?


--------------------
user posted image
PM MAIL   Вверх
Sartorius
Дата 25.5.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

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


 Это почему ты так решил? head - структура из двух int-ов. Где изменение размера?
PM MAIL ICQ   Вверх
mes
Дата 25.5.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
REZiaMIX
Дата 25.5.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Хм , нашел ошибку у себя в исходнике , подправил , все работает.
Цитата

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

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

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



--------------------
user posted image
PM MAIL   Вверх
Sartorius
Дата 25.5.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

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

 unsigned char ом сделай. или вообще битовым полем. Семи бит будет достаточно.
PM MAIL ICQ   Вверх
mes
Дата 25.5.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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;
}; итого два байта на структуру с ограниченым местом под хранение значений 


--------------------
PM MAIL WWW   Вверх
REZiaMIX
Дата 29.5.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Всем спасибо за ответы , проблема решена.


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.