c++ - 如何创建/设计数据结构?

标签 c++ networking data-structures struct network-programming

我是一名中级业余爱好程序员,了解一些 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/

相关文章:

c++ - 从 vector 中获取(下一个)最大对象

networking - 服务 snmpd 重启问题

java - 如何在(基于 Java 的)TCP 中处理多个客户端?

algorithm - 哈希表大小调整、线性探测和复杂性

c++ - reheapify的STL实现

c++ - 编写一个通用的遍历函数,允许灵活地处理具有不同参数的多个函数

c++ - 在 C++ 程序上没有可行的重载 '='

c# - 在 dll 中导出并从 C# 加载的 C++ 函数

c# - System.Net.PeerToPeer 库有任何问题吗?

c++ - 即使我没有使用引用,值(value)也会改变