【问题标题】:What happen when we receive a truncated DNS response?当我们收到截断的 DNS 响应时会发生什么?
【发布时间】:2015-01-28 10:10:24
【问题描述】:

我正在编写一个非常简单的程序来发送 CERT 查询并通过 UDP 从 DNS 接收响应,并使用 wireshark 进行调试。我将查询作为十六进制字符串发送并从同一个套接字接收响应,但是,即使我可以在 Wireshark 中看到完整的字符串(响应),我的程序打印的响应也会被截断。谁能向我解释一下收到回复时到底发生了什么?我测量响应与我发送的查询相同!。请给个建议,我的代码有问题,不知道应该如何捕捉响应。谢谢。

char recv_buffer[4096]; //to allocate the response

//sending query and receiving response 
to = sendto(sock, buffer, sizeof(buffer), 0, (struct sockaddr *) &sock_addr, sizeof(sock_addr));
printf("sent %d bytes to 140.113.216.171\n", to);

int len = sizeof(recv_buffer);
bzero(&recv_buffer, len); //filling with 0 the recv_buffer

from = recvfrom(sock, recv_buffer, len, 0, NULL, NULL);
printf("received %d bytes from 140.113.216.171\n", from);

//Printing the string received
for(int c=0;c<from;c++){
   printf("%c",recv_buffer[c]);
}

【问题讨论】:

  • 你确定响应真的和请求一样吗? DNS 数据包结构牢固,相同的字段位于相同的位置。将二进制数据打印为字符时,您可能会错过主要细节。相反,您应该对数据包结构进行基本解码并至少以数字方式打印:flags、rcode、qdcount、ancount、aucount、adcount。

标签: sockets dns


【解决方案1】:
//Printing the string received
for(int c=0;c<to;c++){

您在这里可能指的是from 而不是to,因为您想要接收的字节数,而不是发送的字节数。

【讨论】:

  • 谢谢@Steffen,我没注意到,让我编辑那部分。但是问题仍然存在,因为我收到相同的响应,我正在打印正确的数组。
  • 检查您在wireshark 中看到的消息长度是否与from 匹配,并检查您是否实际打印from 字符。请注意,%c 将字符打印为二进制,而不是十六进制,因此任何二进制内容(如 \r、\0)都不会按预期显示。
  • 我明白了,实际上我在响应中收到的数据长度为零,而我正在打印的字符串只是消息的一部分(它给了我查询)。问题是为什么我在回复中什么也没收到,因为查询发送没有问题。感谢您的打印建议,实际上我需要以十进制打印,我仍然需要弄清楚如何正确打印二进制内容。
  • 抱歉,您的描述太混乱了。请在任何地方添加错误检查,并且在询问其他人之前,请多思考一下您使用的功能的代码和文档,这样就不会发生微不足道的错误。
  • 对不起,我真的是这方面的新手,我不太容易弄清楚,感谢您的帮助和建议。我会遵循它并带着更明确的问题回来。感谢您的宝贵时间。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 2023-01-17
相关资源
最近更新 更多