2016-04-20 5 views
4

Ich versuche, Udp-Paket an angegebene DNS-Server zu senden und eine Antwort von DNS-Server zu erhalten.Java senden Udp-Paket an DNS-Server

Das Problem ist, dass ich nicht die Antwort vom Server bekomme. Ich versuche ein Paket mit meinem Client-Socket zu erhalten, habe aber keinen Erfolg.

Suchen Sie nach Hilfe, um dieses Problem zu beheben.

Das ist mein UdpClient.java

import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.nio.charset.Charset; 
import java.nio.charset.StandardCharsets; 
import java.util.Scanner; 

class UdpClient 
{ 
    public static void main (String args[]) throws Exception 
    { 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter a hostname: "); 
     // host name 
     String hostname = scan.next(); 
     // socket 
     DatagramSocket clientSocket = new DatagramSocket(); 
     InetAddress ipAddress = InetAddress.getByName(hostname); 
     String message = "0471001000000"; 
     byte[] data = message.getBytes(StandardCharsets.UTF_8); 

     // datagram packet 
     DatagramPacket sendPacket = new DatagramPacket(data, data.length, ipAddress, 53); 
     // send the packet 
     clientSocket.send(sendPacket); 
     // set a receive timeout, 2000 milliseconds 
     // packet for receive 
     byte[] rdata = new byte[1024]; 
     DatagramPacket receivePacket = new DatagramPacket(rdata, rdata.length, ipAddress, 53); 
     // wait for a response from the server 
     clientSocket.receive(receivePacket); 
     System.out.println("Host Name: " + ipAddress.getHostName()); 
     System.out.println("Canonical Host Name: " + ipAddress.getCanonicalHostName()); 
     System.out.println("Local Host: " + ipAddress.getLocalHost()); 
     System.out.println("Loopback Address: " + ipAddress.getLoopbackAddress()); 
     System.out.println("IPv4: " + ipAddress.getHostAddress()); 
     String serverMessage = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
     System.out.println("FROM SERVER: " + serverMessage); 
    } 
} 
+0

Sie überprüfen Haben der Server den Empfang Paket? – flakes

+0

Wie kann ich das überprüfen? Zum Beispiel, wenn ich "google.com" eingeben, wartet das Programm auf Zeile clientSocket.receive (reicePacket) und tut nichts. –

+0

Mein Fehler. Ich nahm an, dass es ein lokaler Server war. – flakes

Antwort

7

Hier ist ein schnelles und schmutziges Beispiel für einen DNS-Eintrag über UDP Abfrage und das Drucken das Sende:

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 

/** 
* A quick and dirty example of query DNS A record and log response. 
* This code has no error handling. 
* 
*/ 

public class DNSClient { 
    private static final String DNS_SERVER_ADDRESS = "8.8.8.8"; 
    private static final int DNS_SERVER_PORT = 53; 

    public static void main(String[] args) throws IOException { 
     String domain = "google.com"; 
     InetAddress ipAddress = InetAddress.getByName(DNS_SERVER_ADDRESS); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     DataOutputStream dos = new DataOutputStream(baos); 

     // *** Build a DNS Request Frame **** 

     // Identifier: A 16-bit identification field generated by the device that creates the DNS query. 
     // It is copied by the server into the response, so it can be used by that device to match that 
     // query to the corresponding reply received from a DNS server. This is used in a manner similar 
     // to how the Identifier field is used in many of the ICMP message types. 
     dos.writeShort(0x1234); 

     // Write Query Flags 
     dos.writeShort(0x0100); 

     // Question Count: Specifies the number of questions in the Question section of the message. 
     dos.writeShort(0x0001); 

     // Answer Record Count: Specifies the number of resource records in the Answer section of the message. 
     dos.writeShort(0x0000); 

     // Authority Record Count: Specifies the number of resource records in the Authority section of 
     // the message. (“NS” stands for “name server”) 
     dos.writeShort(0x0000); 

     // Additional Record Count: Specifies the number of resource records in the Additional section of the message. 
     dos.writeShort(0x0000); 

     String[] domainParts = domain.split("\\."); 
     System.out.println(domain + " has " + domainParts.length + " parts"); 

     for (int i = 0; i<domainParts.length; i++) { 
      System.out.println("Writing: " + domainParts[i]); 
      byte[] domainBytes = domainParts[i].getBytes("UTF-8"); 
      dos.writeByte(domainBytes.length); 
      dos.write(domainBytes); 
     } 

     // No more parts 
     dos.writeByte(0x00); 

     // Type 0x01 = A (Host Request) 
     dos.writeShort(0x0001); 

     // Class 0x01 = IN 
     dos.writeShort(0x0001); 

     byte[] dnsFrame = baos.toByteArray(); 

     System.out.println("Sending: " + dnsFrame.length + " bytes"); 
     for (int i =0; i< dnsFrame.length; i++) { 
      System.out.print("0x" + String.format("%x", dnsFrame[i]) + " "); 
     } 

     // *** Send DNS Request Frame *** 
     DatagramSocket socket = new DatagramSocket(); 
     DatagramPacket dnsReqPacket = new DatagramPacket(dnsFrame, dnsFrame.length, ipAddress, DNS_SERVER_PORT); 
     socket.send(dnsReqPacket); 

     // Await response from DNS server 
     byte[] buf = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(buf, buf.length); 
     socket.receive(packet); 

     System.out.println("\n\nReceived: " + packet.getLength() + " bytes"); 

     for (int i = 0; i < packet.getLength(); i++) { 
      System.out.print(" 0x" + String.format("%x", buf[i]) + " "); 
     } 
     System.out.println("\n"); 


     DataInputStream din = new DataInputStream(new ByteArrayInputStream(buf)); 
     System.out.println("Transaction ID: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Flags: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Questions: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Answers RRs: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Authority RRs: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Additional RRs: 0x" + String.format("%x", din.readShort())); 

     int recLen = 0; 
     while ((recLen = din.readByte()) > 0) { 
      byte[] record = new byte[recLen]; 

      for (int i = 0; i < recLen; i++) { 
       record[i] = din.readByte(); 
      } 

      System.out.println("Record: " + new String(record, "UTF-8")); 
     } 

     System.out.println("Record Type: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Class: 0x" + String.format("%x", din.readShort())); 

     System.out.println("Field: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Type: 0x" + String.format("%x", din.readShort())); 
     System.out.println("Class: 0x" + String.format("%x", din.readShort())); 
     System.out.println("TTL: 0x" + String.format("%x", din.readInt())); 

     short addrLen = din.readShort(); 
     System.out.println("Len: 0x" + String.format("%x", addrLen)); 

     System.out.print("Address: "); 
     for (int i = 0; i < addrLen; i++) { 
      System.out.print("" + String.format("%d", (din.readByte() & 0xFF)) + "."); 
     } 
    } 

}