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

时间:2014-11-03 15:41:23

标签: c++ dns network-programming bit-manipulation

我的问题涉及为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行的短路。这对于我来说似乎是一个非常多的位操作和位掩码,特别是对于这些代码可能存在的所有不同组合。

1 个答案:

答案 0 :(得分:1)

使用C-structure非常危险,因为需要发送过多的网络 big endian格式的int(如powerPC),但大多数流行的procesors(intel)使用 小端。此外,取决于编译器,您不知道您的编译器如何分发 当你使用位域操作时,单词中的位。

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

例如,您可以使用EmerCoin项目中的DNS服务器:

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