This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch feature/udp-support
in repository x2gokdriveclient.

commit 371b471c8a02cbc4759c53531904b7b19f3d5472
Author: Oleksandr Shneyder <o.shney...@phoca-gmbh.de>
Date:   Tue Dec 20 15:00:49 2022 -0600

    Establishing UDP connection.
---
 client.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++----------------
 client.h   |   7 +++++
 2 files changed, 82 insertions(+), 27 deletions(-)

diff --git a/client.cpp b/client.cpp
index fa7f745..c42ddc9 100644
--- a/client.cpp
+++ b/client.cpp
@@ -233,17 +233,8 @@ Client::Client()
     connect(clientSocket, SIGNAL(readyRead()), this, SLOT(dataArrived()) );
 
 
-#warning take code for udp socket here
-    /*
-    {
-        clientSocket=new QUdpSocket(this);
-        connect((QUdpSocket*)clientSocket, SIGNAL(connected()), this, 
SLOT(socketConnected()));
-        connect((QUdpSocket*)clientSocket, SIGNAL(disconnected()), this, 
SLOT(socketDisconnected()));
-        connect((QUdpSocket*)clientSocket, 
SIGNAL(error(QAbstractSocket::SocketError)), this, 
SLOT(socketError(QAbstractSocket::SocketError)));
-        connect((QUdpSocket*)clientSocket, SIGNAL(readyRead()), this, 
SLOT(dataArrived()) );
-    }*/
-
-
+    udpSocket=new QUdpSocket(this);
+    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(udpDataArrived()));
 
 #ifndef Q_OS_LINUX
     connect(QGuiApplication::clipboard(), SIGNAL(changed(QClipboard::Mode)), 
this, SLOT(slotSelectionChanged(QClipboard::Mode)));
@@ -629,6 +620,12 @@ void Client::parseOptions()
             KDRStdErr()<<"Running in debug mode";
             continue;
         }
+        if(args[i]=="--udp-frames")
+        {
+            udpFrames=true;
+            udpHost=args[++i];
+            continue;
+        }
         if(args[i]=="--connect")
         {
             host=args[++i];
@@ -771,14 +768,8 @@ void Client::parseOptions()
 void Client::connectToServer()
 {
 //     setWindowTitle("X2GO SESSION");
-
         KDRStdErr(false)<<"Connecting to remote host "<<host<<":"<<port<<" 
over TCP"<<KDR_ENDL;
         clientSocket->connectToHost(host, port);
-#warning use this to open udp connection
-/*    {
-        KDRStdErr(false)<<"Connecting to remote host "<<host<<":"<<port<<" 
over UDP"<<KDR_ENDL;
-        ((QUdpSocket*)clientSocket)->connectToHost(host, port);
-    }*/
 }
 
 
@@ -787,10 +778,13 @@ QPixmap Client::getPixmapFromCache(uint32_t crc)
     if(!frameCache.contains(crc))
     {
         KDRStdErr()<<"GETPIXMAP: frame "<<KDR_HEX<<crc<<" not found in 
cache"<<KDR_ENDL;
-/*        if(serverVersion<5)
-            exitOnError(tr("Frame not found in cache"));
-        else
-            requestCacheRebuild();*/
+        if(serverVersion<5)
+            return QPixmap();
+        if(serverVersion<8)
+        {
+            requestCacheRebuild();
+            return QPixmap();
+        }
         requestFrame(crc);
         return QPixmap();
     }
@@ -1071,6 +1065,14 @@ void Client::getServerversion()
         checkSrvAliveTimer->start(SERVERALIVETIMEOUT*1000);
     }
     initGeometry();
+    if(serverVersion>=8)
+    {
+        QTimer* t=new QTimer(this);
+        connect(t, SIGNAL(timeout()), this, SLOT(slotSynchronize()));
+        t->start(5000);
+        if(udpFrames)
+            requestUdpFrames();
+    }
 }
 
 void Client::getClientSelection()
@@ -1733,9 +1735,21 @@ void Client::readDataHeader()
             slotDisconnect();
             break;
         }
+        case UDPOPEN:
+        {
+            openUdpConnection();
+            break;
+        }
+        case UDPFAILED:
+        {
+            KDRStdErr()<<"Server rejected UDP connection, trying one more 
time...";
+            requestUdpFrames();
+            break;
+        }
         default:
         {
             KDRStdErr()<<"Unsupported header type: "<<data_type;
+            freeMessageBuffer();
             exitOnError(tr("Unsupported header type"));
             break;
         }
@@ -2013,12 +2027,6 @@ void Client::socketConnected()
     sendClientVersion();
     QTimer::singleShot(2000, this, SLOT(checkServerVersion()));
     //if connected over tcp, sending synchronization packages. In other case, 
just sending KEEPALIVE packets
-    if( serverVersion >=8)
-    {
-        QTimer* t=new QTimer(this);
-        connect(t, SIGNAL(timeout()), this, SLOT(slotSynchronize()));
-        t->start(5000);
-    }
 }
 
 void Client::checkServerVersion()
@@ -2634,3 +2642,43 @@ void Client::updateServerAlive()
     if(checkSrvAliveTimer)
         checkSrvAliveTimer->start(SERVERALIVETIMEOUT*1000);
 }
+
+void Client::requestUdpFrames()
+{
+    if(udpConnectionAttempts>=3)
+    {
+        KDRStdErr()<<"Failed to establish UDP connection, continue over 
TCP"<<KDR_ENDL;
+        return;
+    }
+    char evmsg[EVLENGTH]{};
+    uint32_t etype;
+    etype=OPENUDP;
+    memcpy(evmsg,(char*)&etype,4);
+    KDRStdErr()<<"Requesting UDP connection, attempt number 
"<<++udpConnectionAttempts<<KDR_ENDL;
+    sendEvent(evmsg);
+}
+
+void Client::openUdpConnection()
+{
+    int32_t udp_port=*((uint16_t*)messageBuffer+2);
+    int32_t tmp_cookie[8];
+    memcpy(tmp_cookie, messageBuffer+8,8*4);
+    KDRStdErr()<<"Server is listening on UDP port: "<<udp_port<<KDR_ENDL;
+    KDRStdErr(false)<<"Connecting to remote host "<<udpHost<<":"<<udp_port<<" 
over UDP"<<KDR_ENDL;
+    udpSocket->connectToHost(udpHost, udp_port);
+    if(!udpSocket->waitForConnected(3000))
+    {
+        KDRStdErr(false)<<"Warning, can't establish UDP connection"<<KDR_ENDL;
+    }
+    else
+    {
+        KDRStdErr(false)<<"UDP connection established"<<KDR_ENDL;
+        udpSocket->write((char*)tmp_cookie,8*4);
+    }
+
+//     for(int i=0;i<8;++i)
+//     {
+//         KDRStdErr()<<"Cookie "<<i<<" - "<<tmp_cookie[i]<<KDR_ENDL;
+//     }
+
+}
diff --git a/client.h b/client.h
index 33ee7d1..6ff2ef4 100644
--- a/client.h
+++ b/client.h
@@ -212,6 +212,7 @@ class QLabel;
 class ScreenIdentifier;
 class ExtWin;
 class QTcpSocket;
+class QUdpSocket;
 
 class Client : public QMainWindow
 {
@@ -305,6 +306,8 @@ private:
     void getWinUpdate();
     void getWinUpdateBuffer();
     void renderFrame();
+    void requestUdpFrames();
+    void openUdpConnection();
     void freeMessageBuffer();
     void setCursor();
     void sendGeometryEvent();
@@ -331,6 +334,7 @@ private:
     int width=800;
     int height=600;
     QString host="localhost";
+    QString udpHost="localhost";
     int port=15000;
 
 
@@ -342,6 +346,8 @@ private:
     int dispNumber=1;
     bool serverExtSelection=false;
     bool rootless=false;
+    bool udpFrames=false;
+    int udpConnectionAttempts=0;
     time_t lastServerPacketTime=0;
     QString cookie;
 
@@ -370,6 +376,7 @@ private:
     Qt::WindowFlags savedFlags;
 
     QTcpSocket* clientSocket=0l;
+    QUdpSocket* udpSocket=0l;
     int bytesLeftToRead=0;
     int bytesReady=0;
     char* messageBuffer=0l;

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on 
/srv/git/code.x2go.org/x2gokdriveclient.git
_______________________________________________
x2go-commits mailing list
x2go-commits@lists.x2go.org
https://lists.x2go.org/listinfo/x2go-commits

Reply via email to