Давайте предположим следующее:
Я хотел бы создать структуру для UDP-пакетов .Каждый кадр обычно состоит из заголовка Ethernet, заголовка IP, заголовка UDP и необязательной полезной нагрузки, за которой следует, наконец, FCS (последовательность контрольной суммы кадра).
Длина полезной нагрузки неизвестна / гибкая.Это означает, что при создании структуры полезная нагрузка должна быть последним ее членом ( элемент гибкого массива ).Следовательно, нет места для ФТС.
Так что я подумал о том, какие возможности останутся.
Я придумал следующий фрагмент кода:
#define UDP_PKT(name, payload_length) struct __attribute((__packed__)) \
{ \
struct ether_header eth; \
struct ip iph; \
struct udphdr udph; \
unsigned char payload[payload_length]; \
u_int32_t fcs; \
} name;
Поскольку это недопустимо:
struct __attribute__((__packed__)) udp_packet
{
struct ether_header eth;
struct ip iph;
struct udphdr udph;
unsigned char payload[]; // fam, must always be the last member
u_int32_t fcs;
};
Мой вопрос: это единственная возможность, которая у меня есть?включить FCS в структуру, не имея фиксированного размера массива (полезной нагрузки)?
Если это так, это хорошее решение?Это считается хорошей практикой?