Some more work on MDNS

This commit is contained in:
Ziver Koc 2016-08-12 15:11:26 +02:00
parent 865d0da0aa
commit a3293714c5
2 changed files with 27 additions and 24 deletions

View file

@ -37,9 +37,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.net.DatagramPacket; import java.net.DatagramPacket;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.ArrayList; import java.util.HashSet;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -56,7 +54,7 @@ public class MulticastDNSClient extends ThreadedUDPNetwork implements ThreadedUD
private static final int MDNS_MULTICAST_PORT = 5353; private static final int MDNS_MULTICAST_PORT = 5353;
private HashMap<String,List<String>> activeProbes; private HashSet<Integer> activeProbes;
private DNSResolutionListener listener; private DNSResolutionListener listener;
@ -64,7 +62,7 @@ public class MulticastDNSClient extends ThreadedUDPNetwork implements ThreadedUD
super(MDNS_MULTICAST_ADDR, MDNS_MULTICAST_PORT); super(MDNS_MULTICAST_ADDR, MDNS_MULTICAST_PORT);
setThread( this ); setThread( this );
this.activeProbes = new HashMap<>(); this.activeProbes = new HashSet<>();
} }
public void setListener(DNSResolutionListener listener){ public void setListener(DNSResolutionListener listener){
@ -73,12 +71,13 @@ public class MulticastDNSClient extends ThreadedUDPNetwork implements ThreadedUD
public void sendProbe(String domain) throws IOException { public void sendProbe(String domain) throws IOException {
activeProbes.put(domain, new ArrayList<String>()); int id = (int)(Math.random() * 0xFFFF);
activeProbes.add(id);
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream();
BinaryStructOutputStream out = new BinaryStructOutputStream(buffer); BinaryStructOutputStream out = new BinaryStructOutputStream(buffer);
DNSPacket dnsPacket = new DNSPacket(); DNSPacket dnsPacket = new DNSPacket();
dnsPacket.getHeader().id = (int)(Math.random() * 0xFFFF); dnsPacket.getHeader().id = id;
dnsPacket.getHeader().setDefaultQueryData(); dnsPacket.getHeader().setDefaultQueryData();
dnsPacket.addQuestion(new DNSPacketQuestion( dnsPacket.addQuestion(new DNSPacketQuestion(
domain, domain,
@ -91,9 +90,9 @@ public class MulticastDNSClient extends ThreadedUDPNetwork implements ThreadedUD
InetAddress.getByName( MDNS_MULTICAST_ADDR ), InetAddress.getByName( MDNS_MULTICAST_ADDR ),
MDNS_MULTICAST_PORT ); MDNS_MULTICAST_PORT );
logger.fine("Sending MDSN probe for domain: " + domain); logger.fine("Sending MDSN probe id: "+id+", for domain: " + domain);
System.out.println(ByteUtil.toFormattedString(udpPacket.getData(), udpPacket.getOffset(), udpPacket.getLength())); //System.out.println("Sending:\n"+ByteUtil.toFormattedString(udpPacket.getData(), udpPacket.getOffset(), udpPacket.getLength()));
MultiPrintStream.out.dump(dnsPacket,3); //MultiPrintStream.out.dump(dnsPacket,3);
send(udpPacket); send(udpPacket);
} }
@ -106,19 +105,14 @@ public class MulticastDNSClient extends ThreadedUDPNetwork implements ThreadedUD
BinaryStructInputStream in = new BinaryStructInputStream(buffer); BinaryStructInputStream in = new BinaryStructInputStream(buffer);
DNSPacket dnsPacket = DNSPacket.read(in); DNSPacket dnsPacket = DNSPacket.read(in);
System.out.println(ByteUtil.toFormattedString(packet.getData(), packet.getOffset(), packet.getLength())); //System.out.println("Received:\n"+ByteUtil.toFormattedString(packet.getData(), packet.getOffset(), packet.getLength()));
MultiPrintStream.out.dump(dnsPacket,3); //MultiPrintStream.out.dump(dnsPacket,3);
if (dnsPacket.getHeader().flagQueryResponse && dnsPacket.getHeader().countAnswerRecord > 0) { if (dnsPacket.getHeader().flagQueryResponse) {
String domain = null; if (activeProbes.contains(dnsPacket.getHeader().id)){
if (domain != null && activeProbes.containsKey(domain)){ logger.fine("Received MDSN response from: "+packet.getAddress()+", msg id: " + dnsPacket.getHeader().id);
List<String> list = activeProbes.get(domain); if (listener != null)
if (!list.contains(domain)){ listener.receivedResponse(dnsPacket);
logger.fine("Received MDSN response from: "+packet.getAddress()+", domain: " + domain);
list.add(domain);
if (listener != null)
listener.receivedResponse(dnsPacket);
}
} }
} }
} catch (IOException e){ } catch (IOException e){

View file

@ -1,5 +1,7 @@
package zutil.net.dns; package zutil.net.dns;
import zutil.io.MultiPrintStream;
import java.io.IOException; import java.io.IOException;
/** /**
@ -13,7 +15,14 @@ public class MulticastDNSClientTest {
MulticastDNSClient mdns = new MulticastDNSClient(); MulticastDNSClient mdns = new MulticastDNSClient();
mdns.start(); mdns.start();
//mdns.sendProbe("appletv.local"); //mdns.sendProbe("appletv.local");
//mdns.sendProbe("_services._dns-sd._udp.local"); mdns.sendProbe("_services._dns-sd._udp.local");
mdns.sendProbe("_googlecast._tcp.local"); //mdns.sendProbe("_googlecast._tcp.local");
mdns.setListener(new DNSResolutionListener() {
@Override
public void receivedResponse(DNSPacket packet) {
System.out.println("####### Received:");
MultiPrintStream.out.dump(packet,3);
}
});
} }
} }