Всем добрый день.
Возникла такая проблема. Прикручиваю готовый стек TCPIP к ниосу. Там есть структура:
Код
typedef struct _ARP_PACKET
{
WORD HardwareType;
WORD Protocol;
BYTE MACAddrLen;
BYTE ProtocolLen;
WORD Operation;
MAC_ADDR SenderMACAddr;
IP_ADDR SenderIPAddr;
MAC_ADDR TargetMACAddr;
IP_ADDR TargetIPAddr;
} ARP_PACKET;
Здесь MAC_ADDR это:
Код
typedef struct _MAC_ADDR
{
BYTE v[6];
} MAC_ADDR;
IP_ADDR это DWORD_VAL, а DWORD_VAL это:
Код
typedef union _DWORD_VAL
{
DWORD Val;
WORD w[2];
BYTE v[4];
struct
{
WORD LW;
WORD HW;
} word;
struct
{
BYTE LB;
BYTE HB;
BYTE UB;
BYTE MB;
} byte;
} DWORD_VAL;
В коде подразумевается, что байты каждого поля идут по порядку друг за другом, без промежутков. В реальности выходит, что байты полей до SenderIPAddr располагаются в памяти как надо, по порядку, а вот поле SenderIPAddr располагается в памяти через 2 байта от SenderMACAddr и оказывается выровненным по 32-битной границе. Подозреваю, ниосу удобней стало расположить DWORD выровненным по 32-битной границе, а не разделять DWORD по двум адресам, и он пропустил 2 байта.
Вопрос:
1.Допускается ли такое (по правилам С, в коде из-за этого проблемы)?
2.Лечится ли как-нибудь? (указать бы ему явно, что брать байты надо по порядку, а не выравнивать DWORD по границе 32 бита)