C ++ Build&发送DNS数据包

时间:2013-10-18 03:40:39

标签: c++ c sockets dns

我正在使用C ++编写DNS解析器,构建DNS标头给我带来了问题。从我能够收集到的,标题可以通过结构构建。

typedef struct {
  unsigned short id;

  unsigned char qr :1; // 0 query, 1 response
  unsigned char opcode :4; // 0 standard query
  unsigned char aa :1; // authoritive answer
  unsigned char tc :1; // truncated message
  unsigned char rd :1; // recursion desired

  unsigned char ra :1; // recursion available
  unsigned char z :3; // reserved
  unsigned char rcode :4;  // response code

  unsigned q_count :16; // number of question entries
  unsigned ans_count :16; // number of answer entries
  unsigned auth_count :16; // number of authority entries
  unsigned add_count :16; // number of resource entries
} HEADER;

typedef union {
  HEADER header;
  unsigned char packet_data[1024];
} DNS_PACKET;

我设置标头值,将标头放在DNS_PACKET中,强制转换为(void *)并使用sendto()发送数据包。

在Wireshark中查看其中一个已发送的数据包,表明这些位未在正确的位置设置。例如,我将q_count设置为1,但Wireshark显示包含256个问题的数据包。

在我读过的所有文档中,这似乎是构建数据包的有效途径。我错了吗?有没有更好的方法来构建数据包?

1 个答案:

答案 0 :(得分:1)

我建议您使用libnet构建DNS数据包。它会更容易,从不担心标题的格式。

您确定已经完成了hton()或htonl()吗?