我是一名中级业余爱好程序员,了解一些 C++ 和其他编程语言,现在我正在尝试使用原始套接字而不是 C++ 中的熟套接字,但是当我查看示例和其他人的源代码时(学习目的,不是偷懒)我看到他们都知道如何制作网络层的头部,例如他们写了一个这样的ip头部结构:
struct IP_HEADER
{
BYTE ver_ihl; // Version (4 bits) and Internet Header Length (4 bits)
BYTE type; // Type of Service (8 bits)
WORD length; // Total size of packet (header + data)(16 bits)
WORD packet_id; // (16 bits)
WORD flags_foff; // Flags (3 bits) and Fragment Offset (13 bits)
BYTE time_to_live; // (8 bits)
BYTE protocol; // (8 bits)
WORD hdr_chksum; // Header check sum (16 bits)
DWORD source_ip; // Source Address (32 bits)
DWORD destination_ip; // Destination Address (32 bits)
} IPHEADER;
但是他们怎么知道他们应该在版本上使用 BYTE?我知道是 ip header 版本告诉你它是 ipv4 还是 ipv6 等。但是我怎么知道我应该使用 BYTE 还是 WORD 或任何其他变量?
为简单起见:我正在尝试了解如何自行制作上述结构,让我们说另一种 header ?
最佳答案
IP 报头结构在 RFC 791 中指定:https://www.rfc-editor.org/rfc/rfc791#page-11
该结构将版本(4 位)和 ihl(4 位)组合在一个字节(8 位)中,将标志(3 位)/碎片(13 位)组合在一个字(16 位)中。所有其他部分都一一映射到 BYTE(8 位)、WORD(16 位)和 DWORD(32 位)。
注意:BYTE/WORD/DWORD 不是 C++ 数据类型,这可能在代码中的某处定义如下:
typedef unsigned char BYTE; // 1byte
typedef unsigned short WORD; // 2bytes
typedef unsigned long DWORD; // 4bytes
关于c++ - 如何创建/设计数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17995350/