C++ 构建并发送 DNS 数据包

标签 c++ c sockets dns

我正在使用 C++ 开发 DNS 解析器,构建 DNS header 给我带来了问题。根据我收集到的信息,可以通过结构构造 header 。

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;

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

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

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

最佳答案

我建议您可以使用 libnet 构建 DNS 数据包。这会容易得多,不用担心标题的格式。

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

关于C++ 构建并发送 DNS 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19441193/

相关文章:

java - 在使用 OpenGL-ES、JNI 和 C++ 的 Android 上,帧似乎乱序了

c++ - 对于 OpenCV/C++,无法将 Mat 写入 JPG 或 BMP 以外的任何其他图像格式

c# - 服务器客户端应用程序

Python套接字只接受本地连接

c++ - auto_ptr 在没有分配其返回值的情况下被释放

c# - 从原生 C++ 到 C# 的回调 byte[]

c - 如何在 C 中找到指向当前结构的结构?

c - 对两个 float4[] 数组求和,而不是 int[] 数组(代码更改)

c - printf 导致输出问题

c++ - 如何修复 'Cannot assign requested address?'