Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 当我们收到截断的DNS响应时会发生什么?_Sockets_Dns - Fatal编程技术网

Sockets 当我们收到截断的DNS响应时会发生什么?

Sockets 当我们收到截断的DNS响应时会发生什么?,sockets,dns,Sockets,Dns,我正在编写一个非常简单的程序,通过UDP发送证书查询并接收来自DNS的响应,并使用wireshark进行调试。我将查询作为十六进制字符串发送,并从同一个套接字接收响应,但即使我可以在wireshark中看到完整的字符串(响应),我的程序打印的响应也会被截断。有谁能向我解释一下收到回复时到底发生了什么?。我估计响应与我发送的查询相同!。请给出建议,我的代码中有错误,不知道如何捕获响应。谢谢 char recv_buffer[4096]; //to allocate the response //

我正在编写一个非常简单的程序,通过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]);
}
charrecv_缓冲区[4096]//分配响应
//发送查询和接收响应
to=sendto(sock,buffer,sizeof(buffer),0,(struct sockaddr*)和sock_addr,sizeof(sock_addr));
printf(“已将%d个字节发送到140.113.216.171\n”,发送到);
int len=sizeof(recv_缓冲区);
bzero(和recv_缓冲区,len)//用0填充recv_缓冲区
from=recvfrom(sock,recv_buffer,len,0,NULL,NULL);
printf(“从140.113.216.171接收到%d个字节”,来自);
//打印收到的字符串
for(int c=0;c
//打印收到的字符串

对于(int c=0;cThanks@Steffen,我没有注意到,让我编辑这一部分。但是问题仍然是一样的,因为我收到了相同的响应,我正在打印正确的数组。检查wireshark中看到的消息长度是否与
from
匹配,并检查您是否确实打印
from
字符。请注意at%c将字符打印为二进制,而不是十六进制,因此任何二进制内容(如\r\0)都不会按预期显示。我知道,实际上我在响应中收到的数据长度为零,而我打印的字符串只是消息的一部分(它返回了查询)。问题是为什么我在回复中没有收到任何信息。查询发送时没有出现问题。感谢prints的建议,实际上我需要以十进制打印,我仍然需要找出如何正确打印二进制内容。抱歉,但您的描述太混乱了。请在所有位置添加错误检查,也许可以考虑更多有关在询问其他人之前,请先了解您使用的函数的代码和文档,这样就不会发生小错误。对不起,我在这方面非常新手,我想不出有多容易,我感谢您的帮助和建议。我会按照您的建议进行操作,并提出更明确的问题。谢谢您的时间。您确定回复是真实的吗与请求完全相同?DNS数据包结构是固定的,相同的字段位于相同的位置。将二进制数据打印为字符时,您可能会错过主要细节。相反,您应该对数据包结构进行基本解码,并至少以数字形式打印:标志、rcode、qdcount、ancount、aucount、adcount。
//Printing the string received
for(int c=0;c<to;c++){