1// Copyright 2003-2005 Arthur van Hoff, Rick Blair 2// Licensed under Apache License version 2.0 3// Original license LGPL 4 5package javax.jmdns.impl; 6 7import java.io.IOException; 8import java.net.DatagramPacket; 9import java.util.logging.Level; 10import java.util.logging.Logger; 11 12import javax.jmdns.impl.constants.DNSConstants; 13 14/** 15 * Listen for multicast packets. 16 */ 17class SocketListener extends Thread { 18 static Logger logger = Logger.getLogger(SocketListener.class.getName()); 19 20 /** 21 * 22 */ 23 private final JmDNSImpl _jmDNSImpl; 24 25 /** 26 * @param jmDNSImpl 27 */ 28 SocketListener(JmDNSImpl jmDNSImpl) { 29 super("SocketListener(" + (jmDNSImpl != null ? jmDNSImpl.getName() : "") + ")"); 30 this.setDaemon(true); 31 this._jmDNSImpl = jmDNSImpl; 32 } 33 34 @Override 35 public void run() { 36 try { 37 byte buf[] = new byte[DNSConstants.MAX_MSG_ABSOLUTE]; 38 DatagramPacket packet = new DatagramPacket(buf, buf.length); 39 while (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled()) { 40 packet.setLength(buf.length); 41 this._jmDNSImpl.getSocket().receive(packet); 42 if (this._jmDNSImpl.isCanceling() || this._jmDNSImpl.isCanceled() || this._jmDNSImpl.isClosing() || this._jmDNSImpl.isClosed()) { 43 break; 44 } 45 try { 46 if (this._jmDNSImpl.getLocalHost().shouldIgnorePacket(packet)) { 47 continue; 48 } 49 50 DNSIncoming msg = new DNSIncoming(packet); 51 if (logger.isLoggable(Level.FINEST)) { 52 logger.finest(this.getName() + ".run() JmDNS in:" + msg.print(true)); 53 } 54 if (msg.isQuery()) { 55 if (packet.getPort() != DNSConstants.MDNS_PORT) { 56 this._jmDNSImpl.handleQuery(msg, packet.getAddress(), packet.getPort()); 57 } 58 this._jmDNSImpl.handleQuery(msg, this._jmDNSImpl.getGroup(), DNSConstants.MDNS_PORT); 59 } else { 60 this._jmDNSImpl.handleResponse(msg); 61 } 62 } catch (IOException e) { 63 logger.log(Level.WARNING, this.getName() + ".run() exception ", e); 64 } 65 } 66 } catch (IOException e) { 67 if (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled() && !this._jmDNSImpl.isClosing() && !this._jmDNSImpl.isClosed()) { 68 logger.log(Level.WARNING, this.getName() + ".run() exception ", e); 69 this._jmDNSImpl.recover(); 70 } 71 } 72 if (logger.isLoggable(Level.FINEST)) { 73 logger.finest(this.getName() + ".run() exiting."); 74 } 75 } 76 77 public JmDNSImpl getDns() { 78 return _jmDNSImpl; 79 } 80 81} 82