13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Copyright 2003-2005 Arthur van Hoff, Rick Blair 23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Licensed under Apache License version 2.0 33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Original license LGPL 43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl; 63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.io.IOException; 83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.net.DatagramPacket; 93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Level; 103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Logger; 113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.constants.DNSConstants; 133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/** 153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Listen for multicast packets. 163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanclass SocketListener extends Thread { 183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman static Logger logger = Logger.getLogger(SocketListener.class.getName()); 193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private final JmDNSImpl _jmDNSImpl; 243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param jmDNSImpl 273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman SocketListener(JmDNSImpl jmDNSImpl) { 293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super("SocketListener(" + (jmDNSImpl != null ? jmDNSImpl.getName() : "") + ")"); 303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this.setDaemon(true); 313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this._jmDNSImpl = jmDNSImpl; 323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void run() { 363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman try { 373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman byte buf[] = new byte[DNSConstants.MAX_MSG_ABSOLUTE]; 383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman DatagramPacket packet = new DatagramPacket(buf, buf.length); 393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman while (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled()) { 403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman packet.setLength(buf.length); 413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this._jmDNSImpl.getSocket().receive(packet); 423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (this._jmDNSImpl.isCanceling() || this._jmDNSImpl.isCanceled() || this._jmDNSImpl.isClosing() || this._jmDNSImpl.isClosed()) { 433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman break; 443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman try { 463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (this._jmDNSImpl.getLocalHost().shouldIgnorePacket(packet)) { 473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman continue; 483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman DNSIncoming msg = new DNSIncoming(packet); 513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (logger.isLoggable(Level.FINEST)) { 523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman logger.finest(this.getName() + ".run() JmDNS in:" + msg.print(true)); 533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (msg.isQuery()) { 553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (packet.getPort() != DNSConstants.MDNS_PORT) { 563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this._jmDNSImpl.handleQuery(msg, packet.getAddress(), packet.getPort()); 573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this._jmDNSImpl.handleQuery(msg, this._jmDNSImpl.getGroup(), DNSConstants.MDNS_PORT); 593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } else { 603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this._jmDNSImpl.handleResponse(msg); 613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } catch (IOException e) { 633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman logger.log(Level.WARNING, this.getName() + ".run() exception ", e); 643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } catch (IOException e) { 673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled() && !this._jmDNSImpl.isClosing() && !this._jmDNSImpl.isClosed()) { 683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman logger.log(Level.WARNING, this.getName() + ".run() exception ", e); 693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this._jmDNSImpl.recover(); 703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (logger.isLoggable(Level.FINEST)) { 733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman logger.finest(this.getName() + ".run() exiting."); 743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public JmDNSImpl getDns() { 783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return _jmDNSImpl; 793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman} 82