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

Implementing a DNS Query in c++ according to RFC 1035

本文关键字:实现 DNS 查询 c++ RFC 1035 根据      更新时间:2023-10-16

我的问题涉及为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