Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос чайника по описанию структур / 5 сообщений из 5, страница 1 из 1
28.02.2013, 10:41
    #38169168
nagisa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос чайника по описанию структур
дано СИ (обычный) под микроконтроллер. оперативки соответственно в притык.

задача простая - описать тип SNMP сообщения


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
typedef struct asn_block
 {
    unsigned char type_data;
    unsigned char len_data; 
    unsigned char data[];
 }  asn_block_t;
                
 
typedef struct snmp_message
{
    unsigned char sequence_id;   
    unsigned char head_len; 
    asn_block_t   version;
    asn_block_t   community;   
    unsigned char pdu;
    asn_block_t   id;
    unsigned char head_len_2;
    asn_block_t   error_status;
    asn_block_t   error_index;
    unsigned char sequence_id2;
    unsigned char head_len_3;
    ....
    
}  snmp_message_t ;
 



соответствеенно принятый пакет я делаю типом snmp_message_t и хочу работать с ним как переменнымы
но возникает вопрос как быть с переменными в типе asn_block_t - его же длина переменная и задается в нем же - len_data

как это описать и как с этим правильно работать ? подскажите
...
Рейтинг: 0 / 0
28.02.2013, 10:50
    #38169186
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос чайника по описанию структур
nagisaдано СИ (обычный) под микроконтроллер. оперативки соответственно в притык.

задача простая - описать тип SNMP сообщения

соответствеенно принятый пакет я делаю типом snmp_message_t и хочу работать с ним как переменнымы
но возникает вопрос как быть с переменными в типе asn_block_t - его же длина переменная и задается в нем же - len_data

как это описать и как с этим правильно работать ? подскажите

В том виде в котором представлен snmp_message_t единственный вариант это изменить структуру asn_block_t на:

Код: plaintext
1.
2.
3.
4.
5.
6.
typedef struct asn_block
 {
    unsigned char type_data;
    unsigned char len_data; 
    unsigned char* data;
 }  asn_block_t;



алгоритм чтения:
- читаем sequent_id
- читаем head_len
- читаем version.type_data, version.len_data
- выделяем память под version.data:
Код: plaintext
1.
version.data = malloc(version.len_data)


- читаем из сокета в version.data данные длиной version.len_data
- читаем community.type_data, community.len_data
- выделяем память под community.data:
Код: plaintext
1.
community.data = malloc(community.len_data)


- читаем из сокета в community.data данные длиной community.len_data
...

и т.д.
...
Рейтинг: 0 / 0
28.02.2013, 11:04
    #38169204
nagisa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос чайника по описанию структур
Анатолий Широков,

коллега, обращаю внимание на условия дано СИ (обычный) под микроконтроллер. оперативки соответственно в притык.
те места только под пакет.

вопрос именно в возможности объявления принятого пакета структурой
или я хочу невозможного ?
...
Рейтинг: 0 / 0
28.02.2013, 11:29
    #38169252
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос чайника по описанию структур
nagisa,

nagisaАнатолий Широков,

коллега, обращаю внимание на условия дано СИ (обычный) под микроконтроллер. оперативки соответственно в притык.
те места только под пакет.

вопрос именно в возможности объявления принятого пакета структурой
или я хочу невозможного ?

В том виде, в котором описана snmp_message нет. Если ты хочешь принять пакет целиком и разместить в памяти единым непрерывным блоком, то прийдется виртуализировать:

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

Код: plaintext
1.
2.
3.
4.
typedef struct snmp_message
{
     unsigned char data[1];
} snmp_message_t;



2. asn_block оставляем в первоначальном виде:

Код: plaintext
1.
2.
3.
4.
5.
6.
typedef struct asn_block
 {
    unsigned char type_data;
    unsigned char len_data; 
    unsigned char data[1];
 }  asn_block_t;



ну а дальше рутина:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
/* unsigned char sequence_id;   */
unsigned char snmp_message_sequence_id(snmp_message_t* msg) {
    return msg->data[0];
}
void snmp_message_sequence_id_offset(snmp_message_t* msg, int* offset, int* size) {
   *offset = 0;
   *size = 1;
}
/* unsigned char head_len */
unsigned char snmp_message_head_len(snmp_message_t* msg) {
    int offset, size;
    snmp_message_sequence_id_offset(msg, &offset, &size);
    return msg->data[offset  + size];
}
void snmp_message_head_len_offset(snmp_message_t* msg, int* offset, int* size) {
   snmp_message_sequence_id_offset(offset, size);
   *offset += *size;
   *size += 1;
}
/* asn_block_t   version; */
asn_block_t* snmp_message_version(snmp_message_t* msg) {
    int offset, size;
    snmp_message_head_len_offset(msg, &offset, &size);
    return (asn_block_t*) &msg->data[offset+size];
}
void snmp_message_version_offset(snmp_message_t* msg, int* offset, int* size) {
   snmp_message_head_len_offset(offset, size);
   *offset += *size;
   *size += sizeof(asn_block_t) + snmp_message_version(msg)->len_data - 1;
}
/*    asn_block_t   community;   */
asn_block_t* snmp_message_community(snmp_message_t* msg) {
    int offset, size;
    snmp_message_version_offset(msg, &offset, &size);
    return (asn_block_t*) &msg->data[offset+size];
}
void snmp_message_community_offset(snmp_message_t* msg, int* offset, int* size) {
   snmp_message_version_offset(offset, size);
   *offset += *size;
   *size += sizeof(asn_block_t) + snmp_message_community(msg)->len_data - 1;
}



Писал на коленках, но идея, думаю, понятна.

Модератор: Код исправлен по просьбе автора поста.
...
Рейтинг: 0 / 0
28.02.2013, 11:55
    #38169294
nagisa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос чайника по описанию структур
Анатолий Широков,

cпасибо. я думаю это оптимальный вариант.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос чайника по описанию структур / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]