// 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; import javax.jmdns.impl.constants.DNSConstants; /** * Listen for multicast packets. */ class SocketListener extends Thread { static Logger logger = Logger.getLogger(SocketListener.class.getName()); /** * */ private final JmDNSImpl _jmDNSImpl; /** * @param jmDNSImpl */ SocketListener(JmDNSImpl jmDNSImpl) { super("SocketListener(" + (jmDNSImpl != null ? jmDNSImpl.getName() : "") + ")"); this.setDaemon(true); this._jmDNSImpl = jmDNSImpl; } @Override public void run() { try { byte buf[] = new byte[DNSConstants.MAX_MSG_ABSOLUTE]; DatagramPacket packet = new DatagramPacket(buf, buf.length); while (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled()) { packet.setLength(buf.length); this._jmDNSImpl.getSocket().receive(packet); if (this._jmDNSImpl.isCanceling() || this._jmDNSImpl.isCanceled() || this._jmDNSImpl.isClosing() || this._jmDNSImpl.isClosed()) { break; } try { if (this._jmDNSImpl.getLocalHost().shouldIgnorePacket(packet)) { continue; } DNSIncoming msg = new DNSIncoming(packet); if (logger.isLoggable(Level.FINEST)) { logger.finest(this.getName() + ".run() JmDNS in:" + msg.print(true)); } 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, this.getName() + ".run() exception ", e); } } } catch (IOException e) { if (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled() && !this._jmDNSImpl.isClosing() && !this._jmDNSImpl.isClosed()) { logger.log(Level.WARNING, this.getName() + ".run() exception ", e); this._jmDNSImpl.recover(); } } if (logger.isLoggable(Level.FINEST)) { logger.finest(this.getName() + ".run() exiting."); } } public JmDNSImpl getDns() { return _jmDNSImpl; } }