Tôi có một ++ chương trình C đại diện cho một tiêu đề TCP như một cấu trúc:Bắt kích thước tiêu đề khác nhau bằng cách thay đổi kích thước cửa sổ
#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;
}
Nếu tôi chạy chương trình này tôi nhận được kích thước của tiêu đề này là 24 byte, mà không phải là kích thước tôi mong đợi. Nếu tôi thay đổi kiểu của trường "wWindow" thành "unsigned int wWindow: 16", có cùng số lượng bit như một unsigned short, chương trình cho tôi biết kích thước của struct bây giờ là 20 byte, đúng kích cỡ. Tại sao điều này?
Tôi đang sử dụng Microsoft Visual Studio 2005 với SP1 trên máy 32 bit x86.
@andy: +1, có thể bao gồm #pragma push/pop trên tham số gói để giúp anh ấy. – user7116
Mike B có câu trả lời đúng dưới đây. Xem thêm phần thảo luận này: http://groups.google.com/group/microsoft.public.dotnet.languages.vc/browse_frm/thread/7ea120d16c49611d/bdf918a490a6d61a?lnk=st&q=bitfield#bdf918a490a6d61a – ChrisN