public void run() 
	    {
	    	byte buf[] = new byte[DNSPacket.MAX_MSG_ABSOLUTE];
	        DatagramPacket packet = new DatagramPacket(buf, buf.length);
	        packet.setLength(buf.length);
	        
	        while (_bContinueRunning)
	        {
	        	try
	        	{
	                synchronized(this) {
	                	_MulticastSocket.receive(packet);
	                }
	        	
	                if (!shouldIgnorePacket(packet)) {
	                	ByteBuffer buffer = ByteBuffer.wrap(packet.getData(), packet.getOffset(), packet.getLength());
	                    DNSPacket dnsMessage = DNSPacket.Parse(buffer);
		
	                    if (dnsMessage.isQuery())
	                        onQuery(dnsMessage, packet.getAddress(), packet.getPort());
	                    else
	                        onResponse(dnsMessage);
	                }
	        	} catch(SocketTimeoutException e) { 
	        		// Ignore, this is just to keep us looping checking for cancelations
	        	} catch(IOException e) {
                    _log.warn("Error attempting to recieve DNSPacket: " + e.getMessage());
                    _log.warn("Trying to recover...");
	        		try {
	        			recover();
	        		} catch(IOException ioException) {
                        _log.error("Error trying to recover!  Exception follows.",ioException);
	            		break;
	        		}
	        	}
	        }
	        _bContinueRunning = false;
	        _ListeningThread = null;
	    }