2014-11-03 75 views
1

在C++中實現DNS查詢我的問題與爲RFC 1035定義的DNS查詢構建DNS標頭有關。每個DNS消息中的RFC狀態是按以下格式:按照RFC 1035

+----------------------------------+ 
|   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

這對於使用C結構是非常危險的,因爲網絡需要以大端格式發送 整數(如powerPC),但是最流行的處理程序(intel)使用 little-endian。另外,取決於編譯器,你不知道,當你使用位域操作時,你的編譯器如何在字中分配 位。

我建議你搜索一些輕量級的DNS實現, 並將其用作練習的基礎。

例如,你可以使用DNS服務器從EmerCoin項目:

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