【发布时间】: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。