package se.unlogic.eagledns; import org.apache.log4j.Logger; import org.xbill.DNS.Message; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPConnection implements Runnable { private static final Logger log = Logger.getLogger(UDPConnection.class); private final EagleDNS eagleDNS; private final DatagramSocket socket; private final DatagramPacket inDataPacket; public UDPConnection(EagleDNS eagleDNS, DatagramSocket socket, DatagramPacket inDataPacket) { super(); this.eagleDNS = eagleDNS; this.socket = socket; this.inDataPacket = inDataPacket; } public void run() { try{ byte[] response = null; try { Message query = new Message(inDataPacket.getData()); log.debug("UDP query " + EagleDNS.toString(query.getQuestion()) + " from " + inDataPacket.getSocketAddress()); response = this.eagleDNS.generateReply(query, inDataPacket.getData(), inDataPacket.getLength(), null); if (response == null) { return; } } catch (IOException e) { response = this.eagleDNS.formerrMessage(inDataPacket.getData()); } DatagramPacket outdp = new DatagramPacket(response, response.length, inDataPacket.getAddress(), inDataPacket.getPort()); outdp.setData(response); outdp.setLength(response.length); outdp.setAddress(inDataPacket.getAddress()); outdp.setPort(inDataPacket.getPort()); try { socket.send(outdp); } catch (IOException e) { log.debug("Error sending UDP response to " + inDataPacket.getAddress() + ", " + e); } }catch(Throwable e){ log.warn("Error processing UDP connection from " + inDataPacket.getSocketAddress() + ", " + e); } } }