struct und Direktiven
-
Hallo,
ich arbeite mich grade ein mit TCP / IP Stack und habe eine Struktur angelegt für den Ethernet-Header mit allen Protokollen. Jedoch schließen sich ja Protokolle auch immer gegen einander aus - z.B. kann man entweder ein ARP oder ein IP Paket erhalten. Die Struktur sollte aber für alle Protokolle gelten.
typedef struct ethernet_header { unsigned int Flags; /* Buf flags. */ /* und weitere definitionen wie Ptr auf MAC Adresse und Ether-Type Feld * #ifdef ARP unsigned int ARP_Hwaddr; unsigned int ARP_Length; /* alles zu ARP */ #endif /* IP */ unsigned int IP_Lenght; unsigned int IP_DataLenght; #ifdef TCP unsigned int TCP_Lenght; /* alles zu TCP */ #endif /* alles zu UDP */ unsigned int UDP_Lenght; } Header-Struct;
Kann man das so lösen - oder gibt es noch elegantere Wege? Bzw. wenn ein ARP Paket ankommt und cih über das Ether-Type-Feld herausfinde -> ARP Direktive aktivere -> muss ich dann nicht eher schreiben
#ifdef ARP
#else IP
#endif
oder so ähnlich?
Gruß
fragender
-
Die Präprozessor-Direktiven werden beim Compilieren ausgewertet - d.h. wenn du dein Programm als ARP übersetzt hast, kannst du keine IP-Pakete schlucken. Wenn du da etwas zur Laufzeit unterscheiden willst, bist du vielleicht mit union's besser bedient:
typed struct ethernet_header { unsigned Flags; unsigned type;//Auswahl des Header-Typs union { struct ARP_data ARP_header; struct IP_data IP_header; ... } userdata; };
-
und denk' auch an alignment- und padding-zickereien, wenn du auf eth-pakete über struct-pointer zugreifst. #pragma pack(1) und __attribute__((__packed__)) sollten da weiterhelfen.