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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упаковка полей структуры в буфер 
:(
    Опции темы
sergu
Дата 13.4.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Понимаю что подобная тема поднималась много раз, но все же.
Ситуация следующая:
Есть структура

Код

struct ST
{
char a;
int length_buff;
char buff[2048];
};


Неоходимо отправить данные из этой структуры в сеть. Естественно, что не разумно слать в сеть структуру размером 2053 байта, если в buff[] содержит, например, 5 нужных символов.
Думаю, что рациональным режением этой проблемы, является созданием буфера типа char, в который будет упаковываться эта структура.
Допустим, что в массиве buff[] у нас хранится 10 символов. Соответственно в переменной length_buff хранится число 10, ну а в  char a любое значение.
Плучается, для того чтобы отправить инфу из этой структуры, нам нужно создать буфер send_buff[] размером 15 байт. В первом байте у нас хранится значение из  char a, в со второго байта по пятый int length_buff, а в следующих десяти байтах buff.
Ну и после того как мы упаковли поля делаем отправку send(socket, send_buff, send_buff_length);
Хотелось бы узнать:
1 - как лучше объявить send_buff (статически или динамически). 
2 - как, собственно, производить упаковку.
3 - как заполнить структуру значениями из массива

Кстати. Насчет 32 и 64 разрядов. В моем учебном протоколе строго оговорен, тип и размер данных т.е., например, целое беззнаковое число размером 4 байта.
простите непутевого  smile 

Это сообщение отредактировал(а) sergu - 13.4.2008, 23:42
PM MAIL   Вверх
sergu
Дата 13.4.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот примерное решение проблемы. Прошу товарищей постарше прокоментировать программку и, если можно, дать советы по рациональности и безопасности кода кода.
Код

#include <stdlib.h>
#include <iostream>
using namespace std;

struct ST
{
    char a;
    unsigned int l;
    char buff[2048];
};
void main(void)
{

    ST s;

    int size;

    cin >> s.buff;

    //Случайные данные
    s.a = 'a';
    s.l = 16843009;
    size = sizeof(s.a) + sizeof(s.l)+(strlen(s.buff)+1); //+1 äëÿ 0
    
    char *buff = new char[size];

    char *pa = (char *) &s.a;
    char *pl = (char *) &s.l;
    char *pb = (char *) &s.buff;


    //Упаковка на отправителе
    buff[0] = *pa;
    strncpy(&buff[1], pl, 4);
    strncpy(&buff[5], pb, strlen(s.buff)+1); 


//Распаковка на получателе
    ST st;
    unsigned int *il2;

    st.a = buff[0];    
    il2 = (unsigned int *) &buff[1];
    st.l = *il2;
    strncpy(st.buff,&buff[5], strlen(&buff[5])+1);
}

Спасибо
PM MAIL   Вверх
jonie
Дата 14.4.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



чет какая-то фигня)
Код

 buff[0] = *pa;
 char *pl = (char *) &s.l;  //зачем ?
 strncpy(&buff[1], pl, 4);  //зачем так ?


в общем ябы делал например так (упрощенно ессно для понимания):
если сткрутара данных статична (ну, например, строку надо передать), тогда
Код

pragma pack(push)
pragma pack(1)
typedef struct{
  int stringlen;
} PACKET_HEADER;
pragma pack(pop)

char string[1024];
std::cin.getline(string);
PACKET_HEADER header;
header.stringlen = strlen(string);

char sentBuf[1024];
memcpy(sentBuf,header);
memcpy(&sentBuf+sizeof(header), string);

.....


а ошибок-то у меня огого....)) ну в общем суть, думаю понятно : заголовок, потом данные.

Это сообщение отредактировал(а) jonie - 14.4.2008, 00:53


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
korian
Дата 14.4.2008, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



sergu, 
strncpy копирует до первого попавшегося нуля.
если в ST::buff - могут быть не только строки, то распаковать не получится.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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