【发布时间】:2023-03-12 15:22:01
【问题描述】:
我是一名中级爱好程序员,知道相当多的 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 headers 版本,它告诉你它是 ipv4 还是 ipv6 等。但是我怎么知道我应该使用 BYTE 还是 WORD 或任何其他变量?
为了简单起见:我正在尝试了解如何自己制作像上面那样的结构,让我们说另一种标题?
【问题讨论】:
-
通常有某种规范指定哪些数据项在哪里以及它们使用多少位/字节。
-
在上述情况下,它是一个定义明确的标准。这是一个 Wiki 指针,它专门定义了 IPV4 标头中每个元素的大小和位置:en.wikipedia.org/wiki/IPv4#Packet_structure
标签: c++ networking data-structures struct network-programming