深入解析 DNS 查询:从原理到实践
1. 打印 DNS 消息
我们可以利用之前定义的 print_name() 函数,构建一个将整个 DNS 消息打印到屏幕上的函数。由于 DNS 请求和响应消息具有相同的格式,因此这个函数可以同时打印这两种消息。函数声明如下:
/*dns_query.c*/
void print_dns_message(const char *message, int msg_length);
print_dns_message() 函数接收一个指向消息起始位置的指针和一个表示消息长度的 int 类型数据。
在 print_dns_message() 函数内部,首先要检查消息长度是否足以构成一个有效的 DNS 消息。因为 DNS 头部长度为 12 字节,所以如果消息长度小于 12 字节,就可以判定为无效消息。这样做也能确保我们至少可以读取头部信息,而不用担心会超出接收到的数据范围。检查代码如下:
/*dns_query.c*/
if (msg_length < 12) {
fprintf(stderr, "Message is too short to be valid.\n");
exit(1);
}
接着,将消息指针复制到一个新的变量 msg 中, msg 被定
超级会员免费看
订阅专栏 解锁全文
1730

被折叠的 条评论
为什么被折叠?



