将DNS查询发送到Android中的域
我正在尝试向www.google.com发送DNS查询消息,以获取DNS记录。我阅读了这篇文章以了解DNS查询的结构 我将缓冲区消息创建为:将DNS查询发送到Android中的域,android,sockets,dns,datagram,Android,Sockets,Dns,Datagram,我正在尝试向www.google.com发送DNS查询消息,以获取DNS记录。我阅读了这篇文章以了解DNS查询的结构 我将缓冲区消息创建为: private static final byte[] RequestPacket = { // Transaction ID: 0x0000 0x00, 0x00, // Flags: 0x0000 (Standard query) 0x00, 0x00
private static final byte[] RequestPacket = {
// Transaction ID: 0x0000
0x00, 0x00,
// Flags: 0x0000 (Standard query)
0x00, 0x00,
// Questions: 1
0x00, 0x01,
// Answer RRs: 0
0x00, 0x00,
// Authority RRs: 0
0x00, 0x00,
// Additional RRs: 0
0x00, 0x00,
// Queries
// Name: www.google.com
0x03, 0x77, 0x77, 0x77, 0x06, 0x67, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x03, 0x63,
0x6F, 0x6D, 0x00,
// Type: A Record
0x00, 0x01
};
这就是我创建发送、接收数据包和套接字的方式:
DatagramPacket sendPacket = new DatagramPacket(RequestPacket , RequestPacket .length, InetAddress.getByName("www.google.com"), 9876);
DatagramPacket recievePacket = new DatagramPacket(mBuffer, mBuffer.length);
DatagramSocket socket = new DatagramSocket();
调用socket.receive(receivepacket)时,我无法收到任何响应(SocketTimeoutException
)代码>发送数据包后
我想我弄乱了发送包的端口,但在搜索了谷歌很长时间后,我找到了用于查询DNS的端口
谁能告诉我我到底做错了什么
谢谢InetAddress.getByName()
为您执行DNS查询并返回指定主机的IP地址(主机可能有多个IP地址,如果您需要,请全部使用getAllByName()
)
在您的示例中,getByName(“www.google.com”)
返回谷歌HTTP服务器的IP地址,而不是DNS服务器。无法将DNS查询发送到HTTP服务器。这就是你没有得到回复的原因
如果您真的想发送自己的DNS查询,您需要将它们定向到真正的DNS服务器,如Wifi/蜂窝网络提供商提供的服务器(请参阅),或第三方DNS服务器(如)。谢谢您的回复。实际上,当我查询一个域时,我需要的不仅仅是一个字段,这就是为什么InetAddress是不够的。另外,我把地址改成了谷歌DNS服务器(8.8.8.8),它似乎可以工作。请注意,我必须在最后添加输入RequestPacket才能使其工作。我知道这是一个老问题,但发送您自己的DNS查询而不是随机字节数组的目的是什么?