Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » arp header in 2 programmen unterschiedlich groß

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.12.2009, 17:36 Uhr
~Asdok
Gast


hi,

ich hab hier zwei programme die beide mit arp-netzpaketen arbeiten und eine struktur definiert haben


C++:
typedef struct _arphdr {
  USHORT  ar_hrd;              /* format of hardware address   */
  USHORT  ar_pro;              /* format of protocol address   */
  UCHAR   ar_hln;              /* length of hardware address   */
  UCHAR   ar_pln;              /* length of protocol address   */
  USHORT  ar_op;               /* ARP opcode (command)         */
  UCHAR   ar_sha[ETH_ALEN];    /* sender hardware address      */
  ULONG   ar_sip;              /* sender IP address            */
  UCHAR   ar_tha[ETH_ALEN];    /* target hardware address      */
  ULONG   ar_tip;              /* target IP address            */
} ArpHdr;



beide programme sind in Visual Stuio 2008 geschrieben. Wenn ich bei dem einen Programm ein


C++:
sizeof(ArpHdr);



erhalte ich 28 Byte größe, bei dem anderen Programm sind es 32 Byte

Wenn ich mir das ganze zur Laufzeit auf Hex-Ebene ansehe, ist in dem größeren Header etwas "verrutscht", informationen die eigentlich in das ar_tha Feld gehören, stehen zum Teil in ar_sip drin.

Ich verstehe einfach nicht, was diese struct gegenüber dem anderen Programm vergrößert. Ist wirklich copy/pasted..... aufjedenfall verursacht mir diese größere header massive probleme, weil der ganze kram jetzt nicht mehr richtig läuft

hat jemand ne idee woran das liegen kann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.12.2009, 22:56 Uhr
0xdeadbeef
Gott
(Operator)


Padding. Es ist durchaus gewöhnlich für Compiler, Structs zu Optimierungszwecken so zu packen, dass Variablen an Speicheradressen, die ein vielfaches der Wortgröße des Comupters sind, liegen. Das ist insbesondere im Zusammenhang mit SSE u.ä. von Interesse. Es kann also durchaus vorkommen, dass sich die Struct-Layouts im Speicher von Optimierungsstufe zu Optimierungsstufe unterscheiden - in diesem Fall vermutlich zwischen Debug- und Release-Modus.

Üblicherweise bieten die Compiler Programmierern, die sich auf diesen speziellen Fall undefinierten Verhaltens verlassen (im Grunde ist das schlicht ein Bug), eine Möglichkeit, ihr Verhalten zu kontrollieren. MSVC bietet etwa das pack-Pragma.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 24.12.2009 um 22:58 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.12.2009, 20:33 Uhr
ao

(Operator)


In Microsoft-C:


C++:
#pragma pack (push)   /* Voreinstellung abspeichern */
#pragma pack (1)       /* "dichtest-mögliche Packung einstellen */
typedef struct _arphdr {
  USHORT  ar_hrd;              /* format of hardware address   */
  USHORT  ar_pro;              /* format of protocol address   */
  UCHAR   ar_hln;              /* length of hardware address   */
  UCHAR   ar_pln;              /* length of protocol address   */
  USHORT  ar_op;               /* ARP opcode (command)         */
  UCHAR   ar_sha[ETH_ALEN];    /* sender hardware address      */
  ULONG   ar_sip;              /* sender IP address            */
  UCHAR   ar_tha[ETH_ALEN];    /* target hardware address      */
  ULONG   ar_tip;              /* target IP address            */
} ArpHdr;
#pragma pack (pop)   /* Voreinstellung zurückholen */

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: