【问题标题】:How to create/design data structures?如何创建/设计数据结构?
【发布时间】: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


【解决方案1】:

IP 标头结构在 RFC 791 中指定:https://www.rfc-editor.org/rfc/rfc791#page-11

该结构将版本(4bit)和ihl(4bit)组合在一个BYTE(8bit)中,将Flags(3bit)/Fragmentation(13bit)组合在一个WORD(16bit)中。所有其他部分都一对一映射到 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

【讨论】:

  • 所以对于 4 位的东西我应该使用 BYTE 吗?对于 8 的东西,我应该使用 WORD 吗? O.o 这对我来说没有意义:L 那些 16 位等的呢?
  • @Paze:大概,BYTE 是 8 位,WORD 是 16,DWORD 是 32(尽管您必须查看定义才能确认,因为这些不是标准类型)。第一个字节包含两个 4 位值,打包到一个 8 位变量中。
  • 啊,好吧,我明白了 :) 我一直有一个小想法,可能会是这样,但我真的不确定,你帮了我很多,谢谢,我希望更多的人可以从中受益 :) 我想我现在可以制作自己的标头,并且可以继续使用原始套接字工作;)
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2017-04-10
相关资源
最近更新 更多