我的问题与为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我以前从来没有使用过这样的位域,所以我不完全理解如何将位打包到this...all中,我知道它编译时没有错误,甚至使用了-pedantic标志,这让我有点害怕。
第二个是:
struct messageHeader{
short ID;
short row2;
short QDCNT;
short ANCNT;
short NSCNT;
short ARCNT;
};/End Message Header Struct对于第二种选择,我将使用<<运算符将位移位到用于第2行的短码的正确位置。这对我来说似乎是非常多的位操作和位掩码,特别是对于这些代码可能是的所有不同组合。
发布于 2014-11-12 12:27:18
使用C结构真的很危险,因为在网络上需要发送高字节顺序格式的整数(如powerPC),但大多数流行的处理程序(英特尔)使用低字节顺序。另外,这取决于编译器,你不知道,当你使用位域运算时,编译器是如何分配字中的位的。
我建议您搜索一些轻量级DNS实现,并将其作为练习的基础。
例如,您可以使用EmerCoin项目中的DNS-server:
https://github.com/EvgenijM86/emercoin/blob/master/src/emcdns.cpp
https://stackoverflow.com/questions/26717644
复制相似问题