gpt4 book ai didi

c++ - 根据 RFC 1035 在 C++ 中实现 DNS 查询

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:51 25 4
gpt4 key购买 nike

我的问题涉及为 RFC 1035 定义的 DNS 查询构建 DNS header 。 . RFC 声明每个 DNS 消息都采用以下格式:

+----------------------------------+
| HEADER |
+----------------------------------+
| QUESTION |
+----------------------------------+
| ANSWER |
+----------------------------------+
| AUTHORITY |
+----------------------------------+
| ADDITIONAL |
+----------------------------------+

并且 header 字段/部分遵循以下格式:

 0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| OPCODE |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

我将如何定义标题结构/对象来保存第二行的值?我看到的问题是针对不同情况在此字段中设置特定位。我提出的唯一仍然可以编译并且不违反 RFC 定义的设计需要大量的位操作和位屏蔽。

这是我考虑过的两种实现方式,但我认为这两种都不是理想的解决方案。

    struct messageHeader{
short ID;
//Start of second row which is broken into 2 bytes
unsigned int QR : 1;
unsigned int OPCODE : 4;
unsigned int AA : 1;
unsigned int TC : 1;
unsigned int RD : 1;
//Start of Second byte needed for row 2
unsigned int RA : 1;
unsigned int Z : 3;
unsigned int RCODE : 4;
//End Second row
short QDCNT;
short ANCNT;
short NSCNT;
short ARCNT;

};//End Message Header Struct

我以前从未使用过像这样的位字段,所以我不完全理解我如何将这些位打包到这个中......我所知道的是即使使用 -pedantic 标志它编译也没有错误,这有点吓人我。

第二个是:

struct messageHeader{
short ID;
short row2;
short QDCNT;
short ANCNT;
short NSCNT;
short ARCNT;
};/End Message Header Struct

对于第二个选项,我将使用 << 运算符将位移动到用于第 2 行的 short 的正确位置。这对我来说似乎是大量的位操作和位屏蔽,尤其是对于所有不同的这些代码可能的组合。

最佳答案

使用 C 结构真的很危险,因为需要通过网络发送大端格式的整数(如 powerPC),但大多数流行的处理器(intel)使用小端。另外,取决于编译器,你不知道,你的编译器是如何分发的当您使用位域操作时,单词中的位。

我建议你搜索一些轻量级的 DNS 实现,并将其用作练习的基础。

例如,您可以使用崛起币项目的 DNS 服务器:

https://github.com/EvgenijM86/emercoin/blob/master/src/emcdns.cpp

关于c++ - 根据 RFC 1035 在 C++ 中实现 DNS 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com