根据RFC 1035在c++中实现DNS查询
Implementing a DNS Query in c++ according to RFC 1035
我的问题涉及为RFC 1035定义的DNS查询构建DNS头。RFC规定每个DNS消息的格式如下:
+----------------------------------+
| HEADER |
+----------------------------------+
| QUESTION |
+----------------------------------+
| ANSWER |
+----------------------------------+
| AUTHORITY |
+----------------------------------+
| ADDITIONAL |
+----------------------------------+
标题字段/部分遵循以下格式:
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
我以前从未使用过这样的比特字段,所以我不完全理解如何将比特打包到这个。。。我所知道的是,即使使用了迂腐的标志,它也编译得没有错误,这有点让我害怕
第二种是:
struct messageHeader{
short ID;
short row2;
short QDCNT;
short ANCNT;
short NSCNT;
short ARCNT;
};/End Message Header Struct
对于第二个选项,我将使用<lt;操作员将位移位到用于行2的短路的正确位置。对我来说,这似乎是一个可怕的比特操作和比特屏蔽,尤其是对于这些代码可能的所有不同组合。
使用C结构确实很危险,因为需要通过网络发送大端格式的int(如powerPC),但最流行的处理器(intel)使用小endian。另外,取决于编译器,您不知道编译器是如何分布的当您使用位字段操作时,单词中的位。
我建议你搜索一些轻量级的DNS实现,并将其作为练习的基础。
例如,您可以使用EmerCoin项目中的DNS服务器:
https://github.com/EvgenijM86/emercoin/blob/master/src/emcdns.cpp
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 根据RFC 1035在c++中实现DNS查询