如何创建/设计数据结构? 我是一个中等爱好的程序员,知道一些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; typedef unsigned char BYTE; // 1byte typedef unsigned short WORD; // 2bytes typedef unsigned long DWORD; // 4bytes

如何创建/设计数据结构? 我是一个中等爱好的程序员,知道一些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; typedef unsigned char BYTE; // 1byte typedef unsigned short WORD; // 2bytes typedef unsigned long DWORD; // 4bytes,c++,networking,data-structures,struct,network-programming,C++,Networking,Data Structures,Struct,Network Programming,但是他们怎么知道应该在版本上使用一个字节呢?我知道是ip头版本告诉你它是ipv4还是ipv6等。。但我如何知道我应该使用字节、单词或任何其他变量呢 简单一点:我试图了解如何为另一种报头创建类似于上面的结构?IP报头结构在RFC 791中指定: 该结构将版本(4位)和ihl(4位)组合为一个字节(8位),将标志(3位)/分段(13位)组合为一个字(16位)。所有其他部分都一一映射到字节(8位)、字(16位)和DWORD(32位) 注:字节/Word/dWord不是C++数据类型,这可能是在代码中的

但是他们怎么知道应该在版本上使用一个字节呢?我知道是ip头版本告诉你它是ipv4还是ipv6等。。但我如何知道我应该使用字节、单词或任何其他变量呢


简单一点:我试图了解如何为另一种报头创建类似于上面的结构?

IP报头结构在RFC 791中指定:

该结构将版本(4位)和ihl(4位)组合为一个字节(8位),将标志(3位)/分段(13位)组合为一个字(16位)。所有其他部分都一一映射到字节(8位)、字(16位)和DWORD(32位)

注:字节/Word/dWord不是C++数据类型,这可能是在代码中的某个地方定义的:

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;
typedef unsigned char   BYTE; // 1byte
typedef unsigned short  WORD; // 2bytes
typedef unsigned long  DWORD; // 4bytes

RFC 791中规定了IP标头结构:

该结构将版本(4位)和ihl(4位)组合为一个字节(8位),将标志(3位)/分段(13位)组合为一个字(16位)。所有其他部分都一一映射到字节(8位)、字(16位)和DWORD(32位)

注:字节/Word/dWord不是C++数据类型,这可能是在代码中的某个地方定义的:

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;
typedef unsigned char   BYTE; // 1byte
typedef unsigned short  WORD; // 2bytes
typedef unsigned long  DWORD; // 4bytes

通常会有某种规范来指定哪些数据项在哪里以及它们使用了多少位/字节。在上述情况下,这是一个定义良好的标准。下面是一个Wiki指针,它专门定义IPV4头中每个元素的大小和位置:通常有某种规范指定哪些数据项在哪里以及它们使用了多少位/字节。在上述情况下,它是一个定义良好的标准。下面是一个Wiki指针,它专门定义IPV4报头中每个元素的大小和位置:所以对于4位的内容,我应该使用BYTE?对于8的东西,我应该用单词吗?O.O这对我来说没有意义:L那些16位的是什么?@Paze:大概,
BYTE
是8位,
WORD
是16位,
DWORD
是32位(尽管你必须查看定义才能确认,因为它们不是标准类型)。第一个字节包含两个4位值,打包成一个8位变量。啊,好吧,现在我明白了:)我一直有点想它可能是这样的,但我真的不确定,你帮了我很多忙,谢谢你,我希望更多的人能从中受益:)我想我现在能够制作自己的头文件,并且可以继续使用原始套接字;)所以对于4位的东西,我应该使用字节?对于8的东西,我应该用单词吗?O.O这对我来说没有意义:L那些16位的是什么?@Paze:大概,
BYTE
是8位,
WORD
是16位,
DWORD
是32位(尽管你必须查看定义才能确认,因为它们不是标准类型)。第一个字节包含两个4位值,打包成一个8位变量。啊,好吧,现在我明白了:)我一直有点想它可能是这样的,但我真的不确定,你帮了我很多忙,谢谢你,我希望更多的人能从中受益:)我想我现在能够制作自己的头文件,并且可以继续使用原始套接字;)