jDnsProxy/src/main/java/com/moparisthebest/dns/listen/UdpSync.java

75 lines
2.5 KiB
Java

package com.moparisthebest.dns.listen;
import com.moparisthebest.dns.dto.Packet;
import com.moparisthebest.dns.net.*;
import com.moparisthebest.dns.resolve.Resolver;
import java.io.IOException;
import java.net.*;
import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
public class UdpSync implements Listener {
private final int maxPacketLength = 2048;
private final SocketAddress local;
private final Resolver resolver;
private final ExecutorService executor;
private boolean running = true;
private Thread thisThread = null;
public UdpSync(final SocketAddress local, final Resolver resolver, final ExecutorService executor) {
this.local = local;
this.resolver = resolver;
this.executor = executor;
}
@Override
public void run() {
try (final DatagramSocket ss = new DatagramSocket(local)) {
final DatagramPacket request = new DatagramPacket(new byte[maxPacketLength], maxPacketLength);
thisThread = Thread.currentThread();
while (running) {
ss.receive(request);
//System.out.println("got packet");
final UdpRequestResponse requestResponse = new UdpRequestResponse(request.getSocketAddress(),
new Packet(ByteBuffer.wrap(request.getData(), request.getOffset(), request.getLength()).slice()));
//System.out.println(requestResponse);
//debugPacket(request.getData());
resolver.resolveAsync(requestResponse).thenAcceptAsync((urr) -> {
//debugPacket(bc.getResponse().getBuf().array());
//System.out.println("got response");
final byte[] response = urr.getResponse().getBuf().array();
final DatagramPacket responsePacket = new DatagramPacket(response, response.length); // todo: always exact length? meh
responsePacket.setSocketAddress(urr.getRequester());
try {
ss.send(responsePacket);
} catch (IOException e) {
e.printStackTrace();
}
//System.out.println("sent packet");
}, executor);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void close() {
running = false;
if (thisThread != null)
thisThread.interrupt();
}
}