powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос чайника по описанию структур
5 сообщений из 5, страница 1 из 1
вопрос чайника по описанию структур
    #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
вопрос чайника по описанию структур
    #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
вопрос чайника по описанию структур
    #38169204
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широков,

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

вопрос именно в возможности объявления принятого пакета структурой
или я хочу невозможного ?
...
Рейтинг: 0 / 0
вопрос чайника по описанию структур
    #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
вопрос чайника по описанию структур
    #38169294
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широков,

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


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