package be.neutrinet.ispng.dns;
import org.apache.log4j.Logger;
import org.xbill.DNS.Message;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* Created by wannes on 1/25/15.
*/
public class UDPServer implements Runnable {
private boolean run = true;
private InetAddress addr;
private int port;
private RequestHandler handler;
public UDPServer(InetAddress addr, int port, RequestHandler handler) {
this.addr = addr;
this.port = port;
this.handler = handler;
}
public void stop() {
run = false;
}
@Override
public void run() {
try {
DatagramSocket sock = new DatagramSocket(port, addr);
final short udpLength = 512;
byte[] in = new byte[udpLength];
DatagramPacket indp = new DatagramPacket(in, in.length);
DatagramPacket outdp = null;
while (run) {
indp.setLength(in.length);
try {
sock.receive(indp);
} catch (InterruptedIOException e) {
continue;
}
Message query;
byte[] response = null;
try {
query = new Message(in);
response = handler.generateReply(query, in, indp.getLength(), null);
if (response == null)
continue;
} catch (IOException e) {
response = handler.formerrMessage(in);
}
if (outdp == null)
outdp = new DatagramPacket(response, response.length, indp.getAddress(), indp.getPort());
else {
outdp.setData(response);
outdp.setLength(response.length);
outdp.setAddress(indp.getAddress());
outdp.setPort(indp.getPort());
}
sock.send(outdp);
}
} catch (IOException e) {
Logger.getLogger(getClass()).error("Failed to service request", e);
}
}
}