Index: trunk/BNC/bncnetqueryudp0.cpp
===================================================================
--- trunk/BNC/bncnetqueryudp0.cpp	(revision 1784)
+++ trunk/BNC/bncnetqueryudp0.cpp	(revision 1785)
@@ -15,4 +15,6 @@
  * -----------------------------------------------------------------------*/
 
+#include <iostream>
+
 #include "bncnetqueryudp0.h"
 
@@ -23,4 +25,11 @@
 bncNetQueryUdp0::bncNetQueryUdp0() {
   _udpSocket = 0;
+  _eventLoop = new QEventLoop(this);
+
+  _keepAlive[ 0] = 128;
+  _keepAlive[ 1] =  96;
+  for (int ii = 2; ii <=11; ii++) {
+    _keepAlive[ii] = 0;
+  }
 }
 
@@ -28,4 +37,5 @@
 ////////////////////////////////////////////////////////////////////////////
 bncNetQueryUdp0::~bncNetQueryUdp0() {
+  delete _eventLoop;
   delete _udpSocket;
 }
@@ -34,9 +44,5 @@
 ////////////////////////////////////////////////////////////////////////////
 void bncNetQueryUdp0::stop() {
-#ifndef sparc
-  if (_udpSocket) {
-    _udpSocket->abort();
-  }
-#endif
+  _eventLoop->quit();
   _status = finished;
 }
@@ -50,19 +56,19 @@
 ////////////////////////////////////////////////////////////////////////////
 void bncNetQueryUdp0::waitForReadyRead(QByteArray& outData) {
-  if (_udpSocket) {
-    while (true) {
-      int nBytes = _udpSocket->bytesAvailable();
-      if (nBytes > 0) {
-        outData = _udpSocket->readAll();
-        return;
-      }
-      else if (!_udpSocket->waitForReadyRead(_timeOut)) {
-        delete _udpSocket;
-        _udpSocket = 0;
-        _status = error;
-        emit newMessage(_url.path().toAscii() + " read timeout", true);
-        return;
-      }
-    }
+
+  // Wait Loop
+  // ---------
+  if (!_udpSocket->hasPendingDatagrams()) {
+    _eventLoop->exec();
+  }
+
+  // Append Data
+  // -----------
+  QByteArray datagram;
+  datagram.resize(_udpSocket->pendingDatagramSize());
+  _udpSocket->readDatagram(datagram.data(), datagram.size());
+
+  if (datagram.size() > 0) {
+    outData.append(datagram);
   }
 }
@@ -84,7 +90,15 @@
   }
 
-  delete _udpSocket;
-  _udpSocket = new QUdpSocket();
-  _udpSocket->connectToHost(_url.host(), _url.port());
+  delete _udpSocket; _udpSocket = 0;
+
+  QHostInfo hInfo = QHostInfo::fromName(_url.host());
+  if (!hInfo.addresses().isEmpty()) {
+    _address = hInfo.addresses().first();
+    _udpSocket = new QUdpSocket();
+    _udpSocket->bind(0);
+    connect(_udpSocket, SIGNAL(readyRead()), _eventLoop, SLOT(quit()));
+
+    _udpSocket->writeDatagram(_keepAlive, 12, _address, _url.port());
+  }
 }
 
Index: trunk/BNC/bncnetqueryudp0.h
===================================================================
--- trunk/BNC/bncnetqueryudp0.h	(revision 1784)
+++ trunk/BNC/bncnetqueryudp0.h	(revision 1785)
@@ -16,4 +16,7 @@
  private:
   QUdpSocket*  _udpSocket;
+  QEventLoop*  _eventLoop;
+  QHostAddress _address;
+  char         _keepAlive[12];
 };
 
