blob: c36d6dcdb05bdf737aa53b7b03de0853218886bf [file] [log] [blame]
//Copyright 2003-2005 Arthur van Hoff, Rick Blair
//Licensed under Apache License version 2.0
//Original license LGPL
package javax.jmdns.impl;
import java.io.IOException;
import java.net.DatagramPacket;
//import java.util.logging.Level;
//import java.util.logging.Logger;
/**
* Listen for multicast packets.
*/
class SocketListener implements Runnable
{
// static Logger logger = Logger.getLogger(SocketListener.class.getName());
/**
*
*/
private final JmDNSImpl jmDNSImpl;
/**
* @param jmDNSImpl
*/
SocketListener(JmDNSImpl jmDNSImpl)
{
this.jmDNSImpl = jmDNSImpl;
}
public void run()
{
try
{
byte buf[] = new byte[DNSConstants.MAX_MSG_ABSOLUTE];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
while (this.jmDNSImpl.getState() != DNSState.CANCELED)
{
packet.setLength(buf.length);
this.jmDNSImpl.getSocket().receive(packet);
if (this.jmDNSImpl.getState() == DNSState.CANCELED)
{
break;
}
try
{
if (this.jmDNSImpl.getLocalHost().shouldIgnorePacket(packet))
{
continue;
}
DNSIncoming msg = new DNSIncoming(packet);
// logger.finest("SocketListener.run() JmDNS in:" + msg.print(true));
synchronized (this.jmDNSImpl.getIoLock())
{
if (msg.isQuery())
{
if (packet.getPort() != DNSConstants.MDNS_PORT)
{
this.jmDNSImpl.handleQuery(msg, packet.getAddress(), packet.getPort());
}
this.jmDNSImpl.handleQuery(msg, this.jmDNSImpl.getGroup(), DNSConstants.MDNS_PORT);
}
else
{
this.jmDNSImpl.handleResponse(msg);
}
}
}
catch (IOException e)
{
// logger.log(Level.WARNING, "run() exception ", e);
}
}
}
catch (IOException e)
{
if (this.jmDNSImpl.getState() != DNSState.CANCELED)
{
// logger.log(Level.WARNING, "run() exception ", e);
this.jmDNSImpl.recover();
}
}
}
}