import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.HashMap;

public class UDPDnsMockupServer {
    private static final HashMap<String, String> dnsMap = new HashMap<>();

    static {
        dnsMap.put("example.com", "93.184.216.34");
        dnsMap.put("localhost", "127.0.0.1");
        dnsMap.put("example.org", "93.184.216.34");
        dnsMap.put("robin-ahn.de", "169.23.444.2");
    }

    public static void main(String[] args) {
        final int serverPort = 5959;

        try {
            DatagramSocket socket = new DatagramSocket(serverPort);
            byte[] buffer = new byte[1024];

            System.out.println("UDP DNS Mockup Server läuft auf Port " + serverPort);

            while (true) {
                DatagramPacket requestPacket = new DatagramPacket(buffer, buffer.length);

                // Auf ankommende Pakete warten
                socket.receive(requestPacket);

                // Daten aus dem empfangenen Paket extrahieren
                String receivedDnsName = new String(requestPacket.getData(), 0, requestPacket.getLength()).trim();
                InetAddress clientAddress = requestPacket.getAddress();
                int clientPort = requestPacket.getPort();

                // DNS-Name in IP-Adresse umwandeln
                String ipAddress = dnsMap.getOrDefault(receivedDnsName, "unbekannt");

                // Antwortpaket vorbereiten
                byte[] responseData = ipAddress.getBytes();
                DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, clientAddress, clientPort);

                // Antwortpaket senden
                socket.send(responsePacket);

                System.out.println("Anfrage von " + clientAddress + ":" + clientPort + " - DNS-Name: '" + receivedDnsName + "' -> IP: '" + ipAddress + "'");
            }
        } catch (SocketException e) {
            System.err.println("SocketException: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("IOException: " + e.getMessage());
        }
    }
}