Ich habe ein C++ Programm einen TCP-Header als Struktur repräsentiert:Erste unterschiedliche Header-Größe, indem Fenstergröße
#include "stdafx.h"
/* TCP HEADER
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
typedef struct { // RFC793
WORD wSourcePort;
WORD wDestPort;
DWORD dwSequence;
DWORD dwAcknowledgment;
unsigned int byReserved1:4;
unsigned int byDataOffset:4;
unsigned int fFIN:1;
unsigned int fSYN:1;
unsigned int fRST:1;
unsigned int fPSH:1;
unsigned int fACK:1;
unsigned int fURG:1;
unsigned int byReserved2:2;
unsigned short wWindow;
WORD wChecksum;
WORD wUrgentPointer;
} TCP_HEADER, *PTCP_HEADER;
int _tmain(int argc, _TCHAR* argv[])
{
printf("TCP header length: %d\n", sizeof(TCP_HEADER));
return 0;
}
Wenn ich dieses Programm mir die Größe dieses Headers als 24 Bytes erhalten laufen, die nicht die Größe, die ich erwartet hatte. Wenn ich den Typ des Feldes "wWindow" zu "unsigned int wWindow: 16" ändere, das die gleiche Anzahl von Bits wie ein unsigned short hat, sagt das Programm mir, dass die Größe der Struktur jetzt 20 Bytes ist, die richtige Größe. Warum ist das?
Ich verwende Microsoft Visual Studio 2005 mit SP1 auf einem 32-Bit-x86-Computer.
@andy: +1, könnte # pragma push/pop auf dem pack-Parameter enthalten, um ihm zu helfen. – user7116
Mike B hat die richtige Antwort unten. Siehe auch diese Diskussion: http://groups.google.com/group/microsoft.public.dotnet.languages.vc/browse_frm/thread/7ea120d16c49611d/bdf918a490a6d61a?lnk=st&q=bitfield#bdf918a490a6d61a – ChrisN