首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据RFC1035在c++中实现域名系统查询

根据RFC1035在c++中实现域名系统查询
EN

Stack Overflow用户
提问于 2014-11-03 23:41:23
回答 1查看 1K关注 0票数 1

我的问题与为RFC 1035定义的DNS查询构造DNS头有关。RFC声明每个DNS消息采用以下格式:

代码语言:javascript
复制
+----------------------------------+
|            HEADER                |
+----------------------------------+
|            QUESTION              |
+----------------------------------+
|            ANSWER                |
+----------------------------------+
|           AUTHORITY              |
+----------------------------------+
|           ADDITIONAL             |
+----------------------------------+

并且标题字段/部分遵循以下格式:

代码语言:javascript
复制
 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的定义,需要大量的位操作和位掩码。

这是我考虑过的两个实现,但是我认为这两个都不是理想的解决方案。

代码语言:javascript
复制
    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标志,这让我有点害怕。

第二个是:

代码语言:javascript
复制
struct messageHeader{
    short ID;
    short row2;
    short QDCNT;
    short ANCNT;
    short NSCNT;
    short ARCNT;
};/End Message Header Struct

对于第二种选择,我将使用<<运算符将位移位到用于第2行的短码的正确位置。这对我来说似乎是非常多的位操作和位掩码,特别是对于这些代码可能是的所有不同组合。

EN

回答 1

Stack Overflow用户

发布于 2014-11-12 12:27:18

使用C结构真的很危险,因为在网络上需要发送高字节顺序格式的整数(如powerPC),但大多数流行的处理程序(英特尔)使用低字节顺序。另外,这取决于编译器,你不知道,当你使用位域运算时,编译器是如何分配字中的位的。

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

例如,您可以使用EmerCoin项目中的DNS-server:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26717644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档