C ++构建和发送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个问题的数据包。

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

我建议你可以使用libnet来构建DNS数据包。 这将更容易,从不担心标题的格式。

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