【问题标题】:Sending DNS query to a domain in Android在 Android 中向域发送 DNS 查询
【发布时间】:2016-07-25 07:40:21
【问题描述】:

我正在尝试向 www.google.com 发送 DNS 查询消息以获取 DNS 记录。我阅读了this 文章以了解DNS 查询的结构。

我将缓冲区消息创建为:

 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(recievePacket);时,我无法收到任何回复(SocketTimeoutException

我想我弄乱了我发送数据包的端口,但在谷歌搜索了很长时间后,我发现这是查询 DNS 的端口。

谁能告诉我我到底做错了什么?

谢谢

【问题讨论】:

    标签: android sockets dns datagram


    【解决方案1】:

    InetAddress.getByName() 为您执行 DNS 查询并返回指定主机的 IP 地址(该主机可能有多个 IP 地址,如果您都需要它们,请改用getAllByName())。

    在您的示例中,getByName("www.google.com") 返回 Google 的 HTTP 服务器的 IP 地址,不是 DNS 服务器。您不能将 DNS 查询发送到 HTTP 服务器。这就是您没有得到回复的原因。

    如果您真的想发送自己的 DNS 查询,则需要将它们定向到真正的 DNS 服务器,例如您的 Wifi/蜂窝网络提供商提供的服务器(请参阅How do you get the current DNS servers for Android?)或第三方 DNS 服务器(比如Google's Public DNS)。

    【讨论】:

    • 感谢您的回复。实际上,当我查询域时,我需要的不仅仅是 A 字段,这就是 InetAddress 不够的原因。另外,我将地址更改为谷歌 DNS 服务器(8.8.8.8),它似乎工作。请注意,我必须在最后在 RequestPacket 中添加 IN 类型才能使其正常工作。
    • 我知道这是一个老问题,但是发送您自己的 DNS 查询而不是随机字节数组的目的是什么?
    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2015-11-13
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多