java - 从 DNS 响应获取 IP

标签 java dns

一般来说,我正在尝试解码 DNS 响应。我已经设法从响应的“问题”部分检索名称,但无法从“答案”部分提取 IP 地址。我很清楚 InetAddress.getByName() 但这不是我需要的。我需要弄清楚如何将这组字节转换为 IP 地址...... enter image description here

private static void disectQuery(byte[] received) {

    ByteArrayInputStream bais = new ByteArrayInputStream(received);
    DataInputStream DataIS = new DataInputStream (bais);

    DNSResponse Response = new DNSResponse();

    try {
        Response.TID = DataIS.readShort();
        Response.Flags = DataIS.readShort();
        Response.NumQuestions = DataIS.readShort ();
        Response.NumAnswers = DataIS.readShort();
        Response.NumAuthorities = DataIS.readShort ();
        Response.NumAdditional = DataIS.readShort ();

        String rest = null;
        int questionsLeft = Response.NumQuestions;
        while(questionsLeft-- > 0) {
            byte[] buffer = new byte[lastHostQueried.length()+1];
            DataIS.readFully (buffer);
            rest = new String(buffer, "latin1");
            int queryType = DataIS.readShort ();
            int queryClass = DataIS.readShort ();
        }
        int answersLeft = Response.NumAnswers;
        int i=13;
        while(i-- > 0) {
            DataIS.readShort();
        }
        while(answersLeft-- > 0) {
            ????
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

最佳答案

好吧,我的主要问题是使用 readShort() 时没有真正注意它在做什么。使用 readUnsignedByte() 我能够提取与在wireshark 中看到的相同信息。所以我只是将所有数据移动到一个字符串中,然后从中解析出 IP 地址。

        //Move remaining response bytes into string
        String answers = "";
        try {
            while(true) {
                rest = DataIS.readUnsignedByte() + "";
                answers += Integer.parseInt(rest, 10) + " ";
            }
        }
        catch(EOFException ignore) {}
        String[] answersArray = answers.split(" ");

        //Initialize IPAddresses array
        String IPAddresses[] = new String[Response.NumAnswers];
        for(int i=0; i<Response.NumAnswers; i++)
            IPAddresses[i] = "";

        int offset = 12;
        for(int i=0; i<Response.NumAnswers; i++) {


            int j=0;
            while(j++<3) 
                IPAddresses[i] += answersArray[offset+j] + ".";
            IPAddresses[i] += answersArray[offset+j] + "";
            offset += 16;
        }

关于java - 从 DNS 响应获取 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23328379/

相关文章:

powershell - Powershell Invoke-WebRequest返回 “remote name could not be resolved”,但不返回代理错误

c - getnameinfo() 是否可用于返回单个 IP 地址的多个主机名

java - 如何在 Java Swing 中检查 SQL 查询的批量执行是否成功?

java - 使用 c :out tag 访问 session 中 1 个 java bean 的属性

docker - 在Docker桥上访问服务

dns - 使用 MX 记录将电子邮件转发到另一个域

java - 如何解析通过 TCP 收到的损坏消息

java - 如何在 iReport 中的现有 strip 之间插入细节 strip ?

java - 从字符串启动 Controller 打印列表对象以查看(HTML)

go - 给定一个端口,在 Golang 中返回相应的服务(例如 http、ssh...)