Index: trunk/BNC/bnc.pro
===================================================================
--- trunk/BNC/bnc.pro	(revision 1717)
+++ trunk/BNC/bnc.pro	(revision 1718)
@@ -31,5 +31,5 @@
           bncnetquery.h bncnetqueryv1.h bncnetqueryv2.h               \
           bncnetqueryrtp.h bncsettings.h latencychecker.h             \
-          bncipport.h bncnetqueryv0.h                                 \ 
+          bncipport.h bncnetqueryv0.h bncnetqueryudp.h                \ 
           RTCM/GPSDecoder.h RTCM/RTCM2.h RTCM/RTCM2Decoder.h          \
           RTCM/RTCM2_2021.h RTCM/rtcm_utils.h                         \
@@ -51,5 +51,5 @@
           bnczerodecoder.cpp bncnetqueryv1.cpp bncnetqueryv2.cpp      \
           bncnetqueryrtp.cpp bncsettings.cpp latencychecker.cpp       \
-          bncipport.cpp bncnetqueryv0.cpp                             \
+          bncipport.cpp bncnetqueryv0.cpp bncnetqueryudp.cpp          \
           RTCM/RTCM2.cpp RTCM/RTCM2Decoder.cpp                        \
           RTCM/RTCM2_2021.cpp RTCM/rtcm_utils.cpp                     \
Index: trunk/BNC/bncnetqueryudp.cpp
===================================================================
--- trunk/BNC/bncnetqueryudp.cpp	(revision 1718)
+++ trunk/BNC/bncnetqueryudp.cpp	(revision 1718)
@@ -0,0 +1,116 @@
+/* -------------------------------------------------------------------------
+ * BKG NTRIP Client
+ * -------------------------------------------------------------------------
+ *
+ * Class:      bncNetQueryUdp
+ *
+ * Purpose:    Blocking Network Requests (NTRIP Version 2 with plain UDP)
+ *
+ * Author:     L. Mervart
+ *
+ * Created:    04-Feb-2009
+ *
+ * Changes:    
+ *
+ * -----------------------------------------------------------------------*/
+
+#include <iostream>
+#include <iomanip>
+
+#include "bncnetqueryudp.h"
+#include "bncsettings.h"
+
+using namespace std;
+
+#define BNCVERSION "1.7"
+
+// Constructor
+////////////////////////////////////////////////////////////////////////////
+bncNetQueryUdp::bncNetQueryUdp() {
+  _udpSocket = 0;
+  _eventLoop = new QEventLoop(this);
+}
+
+// Destructor
+////////////////////////////////////////////////////////////////////////////
+bncNetQueryUdp::~bncNetQueryUdp() {
+  delete _eventLoop;
+  delete _udpSocket;
+}
+
+// 
+////////////////////////////////////////////////////////////////////////////
+void bncNetQueryUdp::stop() {
+  _eventLoop->quit();
+  _status = finished;
+}
+
+// 
+////////////////////////////////////////////////////////////////////////////
+void bncNetQueryUdp::slotKeepAlive() {
+}
+
+// 
+////////////////////////////////////////////////////////////////////////////
+void bncNetQueryUdp::waitForRequestResult(const QUrl&, QByteArray&) {
+}
+
+// 
+////////////////////////////////////////////////////////////////////////////
+void bncNetQueryUdp::waitForReadyRead(QByteArray& outData) {
+
+  // Wait Loop
+  // ---------
+  if (!_udpSocket->hasPendingDatagrams()) {
+    _eventLoop->exec();
+  }
+
+  // Append Data
+  // -----------
+  QByteArray datagram;
+  datagram.resize(_udpSocket->pendingDatagramSize());
+  _udpSocket->readDatagram(datagram.data(), datagram.size());
+
+  if (datagram.size() > 12) {
+    outData.append(datagram.mid(12));
+  }
+}
+
+// Connect to Caster, send the Request
+////////////////////////////////////////////////////////////////////////////
+void bncNetQueryUdp::startRequest(const QUrl& url, const QByteArray& gga) {
+
+  _status = running;
+
+  delete _udpSocket;
+  _udpSocket = new QUdpSocket();
+  _udpSocket->bind(0);
+  connect(_udpSocket, SIGNAL(readyRead()), _eventLoop, SLOT(quit()));
+  QByteArray clientPort = QString("%1").arg(_udpSocket->localPort()).toAscii();
+
+  // Send initial RTP packet for firewall handling
+  // ---------------------------------------------
+  char rtpbuffer[12];
+  rtpbuffer[0]  = (2<<6);
+  rtpbuffer[1]  = 96;
+  rtpbuffer[2]  = 0;
+  rtpbuffer[3]  = 0;
+  rtpbuffer[4]  = 0;
+  rtpbuffer[5]  = 0;
+  rtpbuffer[6]  = 0;
+  rtpbuffer[7]  = 0;
+  rtpbuffer[8]  = 0;
+  rtpbuffer[9]  = 0; 
+  rtpbuffer[10] = 0;
+  rtpbuffer[11] = 0;
+
+  QHostInfo hInfo = QHostInfo::fromName(url.host());
+
+  QHostAddress address;
+  if (!hInfo.addresses().isEmpty()) {
+    address = hInfo.addresses().first();
+    _udpSocket->writeDatagram(rtpbuffer, 12, address, url.port());
+  }
+
+}
+
Index: trunk/BNC/bncnetqueryudp.h
===================================================================
--- trunk/BNC/bncnetqueryudp.h	(revision 1718)
+++ trunk/BNC/bncnetqueryudp.h	(revision 1718)
@@ -0,0 +1,25 @@
+#ifndef BNCNETQUERYUDP_H
+#define BNCNETQUERYUDP_H
+
+#include "bncnetquery.h"
+
+class bncNetQueryUdp : public bncNetQuery {
+ Q_OBJECT
+ public:
+  bncNetQueryUdp();
+  virtual ~bncNetQueryUdp();
+
+  virtual void stop();
+  virtual void waitForRequestResult(const QUrl& url, QByteArray& outData);
+  virtual void startRequest(const QUrl& url, const QByteArray& gga);
+  virtual void waitForReadyRead(QByteArray& outData);
+
+ private slots:
+  void slotKeepAlive();
+
+ private:
+  QUdpSocket* _udpSocket;
+  QEventLoop* _eventLoop;
+};
+
+#endif
