75 lines
2.5 KiB
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();
|
|
}
|
|
}
|