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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скопировать в структуру данные 
:(
    Опции темы
klyxa
Дата 5.2.2011, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



привет.есть структура
Код

typedef struct __header__
{
    UCHAR DstMAC[6];
    UCHAR SrcMAC[6];
    USHORT EthType; 
}eth_head;

typedef struct __packet__
{
    eth_head header;
    UCHAR      *data;
} m_packet;


есть код
Код

BOOL DoReadProc(m_packet *packet)
{
    PUCHAR      buf;
    BOOLEAN   status;
    ULONG       bts;

    buf = malloc(100);
    
    if (buf == NULL)
        return FALSE;

    while(1)
   {
    status = (BOOLEAN)ReadFile(glob_var.hndl, (LPVOID)buf, 100, &bts, NULL);
            
        if (status)
        {
        //copy to packet
                return TRUE;
        }            
    
    }
    return FALSE;
}


Как скопировать в структуру(packet) данные из буфера(buf)?



PM MAIL   Вверх
volatile
Дата 5.2.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



вообще-то вот так:
Код

memcpy(packet, buf, sizeof(m_packet));

Но вы уверены что структура файла совпадает со структурой m_packet?
если она была записана на машине с другим порядком байтов, то получится фигня.
так-же есть еще проблема выравнивания.
Вобщем это все не безопасный код, и его можно использовать только для внутренних нужд.
в серьезных проектах, нужно использовать сериализацию, или что-то более надёжное.

PM MAIL   Вверх
volatile
Дата 5.2.2011, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



И еще, зачем вечный цикл?
Цитата(klyxa @  5.2.2011,  22:27 Найти цитируемый пост)
 while(1)


PM MAIL   Вверх
klyxa
Дата 6.2.2011, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

Но вы уверены что структура файла совпадает со структурой m_packet?

насчёт заголовка да, а оставшуюся часть я хотел представить как набор байтов.


Код

И еще, зачем вечный цикл?

ReadFile для обращения к драйверу. Если в очереди пакетов драйвера окажется принятый пакет, то я скопирую данные в буфер,переданный в параметрах ReadFile.
Т.к. пакета может не оказаться я закинул его в цикл. 

И если пакет всё же пришёл, то нужно данные оформить в виде описанной структуры. Смогу ли  я таким примитивным способом это сделать,т.е. голова,хвост?
PM MAIL   Вверх
volatile
Дата 6.2.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

typedef struct __packet__
{
    eth_head header;
    UCHAR      *data; // Это указатель. этого делать нельзя. 
} m_packet;


Если вы хотите представить данные после заголовка, просто набором байтов, то что-то типа 
Код

UCHAR  data[size]; // size - размер блока байтов.


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


Эксперт
****


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

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



кроме того, как я писал выше, есть еще проблема выравнивания.
например
Код

   UCHAR DstMAC[6];
   UCHAR SrcMAC[6];
это будет выглядеть примерно так: 6 байтов DstMAC, затем 2 байта не используется, для выравнивания на 32 бита.
Затем следующие 6 байтов SrcMAC, и так далее.

Если вы записывали данные именно этой-же программой, на этом же компе, то проблем не будет, но скорей всего вы ожидаете совсем другого.
Если не хотите чтоб было выравнивание на границу слова, используйте
Код

#pragma pack(push, 1)
  // ...
  // здесь описание ваших структур.
  // ...
#pragma pack(pop)

PM MAIL   Вверх
tapa
Дата 6.2.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



volatile, спасибо буду думать smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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