我的问题涉及为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
我之前从未使用过像这样的位字段,所以我不完全理解如何将这些位打包到这个...我所知道的是它编译没有错误,即使使用-pedantic标志也有点恐慌我
第二个是:
struct messageHeader{
short ID;
short row2;
short QDCNT;
short ANCNT;
short NSCNT;
short ARCNT;
};/End Message Header Struct
对于第二个选项,我会使用<<运算符将位移位到正确的位置,用于第2行的短路。这对于我来说似乎是一个非常多的位操作和位掩码,特别是对于这些代码可能存在的所有不同组合。
答案 0 :(得分:1)
使用C-structure非常危险,因为需要发送过多的网络 big endian格式的int(如powerPC),但大多数流行的procesors(intel)使用 小端。此外,取决于编译器,您不知道您的编译器如何分发 当你使用位域操作时,单词中的位。
我建议你搜索一些轻量级的DNS实现, 并将其作为练习的基础。
例如,您可以使用EmerCoin项目中的DNS服务器:
https://github.com/EvgenijM86/emercoin/blob/master/src/emcdns.cpp