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.
    🙂


Anmelden zum Antworten