1

我是一个中级爱好程序员,知道一些 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 或任何其他变量?

让事情变得简单:我试图了解如何自己制作像上面那样的结构,让我们说另一种标题?

4

1 回答 1

5

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
于 2013-08-01T13:31:32.120 回答