[X2Go-Commits] [x2gokdrive] 01/01: Sending server keep alive event from sendframe thread.

git-admin at x2go.org git-admin at x2go.org
Mon Jan 9 17:29:30 CET 2023


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

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

commit e416ef03fda75e71e7c1f53a6528ab913a976f48
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date:   Mon Jan 9 10:29:21 2023 -0600

    Sending server keep alive event from sendframe thread.
---
 x2gokdriveremote.c | 76 +++++++++++++++++++++++++++++-------------------------
 x2gokdriveremote.h |  8 +++---
 2 files changed, 46 insertions(+), 38 deletions(-)

diff --git a/x2gokdriveremote.c b/x2gokdriveremote.c
index 8c8b09e..e814150 100644
--- a/x2gokdriveremote.c
+++ b/x2gokdriveremote.c
@@ -388,7 +388,7 @@ void remote_sendVersion(void)
     *((uint32_t*)buffer)=SERVERVERSION; //4B
     *((uint16_t*)buffer+2)=FEATURE_VERSION;
     EPHYR_DBG("Sending server version: %d", FEATURE_VERSION);
-    l=write(remoteVars.clientsock_tcp,buffer,56);
+    l=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
     remoteVars.server_version_sent=TRUE;
 }
 
@@ -399,7 +399,7 @@ void request_selection_from_client(enum SelectionType selection)
 
     *((uint32_t*)buffer)=DEMANDCLIENTSELECTION; //4B
     *((uint16_t*)buffer+2)=(uint16_t)selection;
-    l=write(remoteVars.clientsock_tcp,buffer,56);
+    l=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
     EPHYR_DBG("requesting selection from client");
 }
 
@@ -435,11 +435,11 @@ int32_t send_cursor(struct cursorFrame* cursor)
 //     EPHYR_DBG("SENDING CURSOR %d with size %d", cursor->serialNumber, cursor->size);
 
 //    #warning check this
-    ln=write(remoteVars.clientsock_tcp,buffer,56);
+    ln=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
 
     while(sent<cursor->size)
     {
-        l=write(remoteVars.clientsock_tcp, cursor->data+sent,((cursor->size-sent)<MAXMSGSIZE)?(cursor->size-sent):MAXMSGSIZE);
+        l=remote_write_socket(remoteVars.clientsock_tcp, cursor->data+sent,((cursor->size-sent)<MAXMSGSIZE)?(cursor->size-sent):MAXMSGSIZE);
         if(l<0)
         {
             EPHYR_DBG("Error sending cursor!!!!!");
@@ -513,7 +513,7 @@ int32_t send_frame(u_int32_t width, uint32_t height, uint32_t x, uint32_t y, uin
 
     if(!remoteVars.send_frames_over_udp)
     {
-        ln=write(remoteVars.clientsock_tcp, buffer,56);
+        ln=remote_write_socket(remoteVars.clientsock_tcp, buffer,56);
     }
     else
     {
@@ -551,11 +551,11 @@ int32_t send_frame(u_int32_t width, uint32_t height, uint32_t x, uint32_t y, uin
         {
             sent = 0;
             //        #warning check this
-            ln=write(remoteVars.clientsock_tcp, buffer, 64);
+            ln=remote_write_socket(remoteVars.clientsock_tcp, buffer, 64);
 
             while(sent<regions[i].size)
             {
-                l=write(remoteVars.clientsock_tcp,regions[i].compressed_data+sent,
+                l=remote_write_socket(remoteVars.clientsock_tcp,regions[i].compressed_data+sent,
                         ((regions[i].size-sent)<MAXMSGSIZE)?(regions[i].size-sent):MAXMSGSIZE);
                 if(l<0)
                 {
@@ -631,10 +631,10 @@ int send_deleted_elements(void)
     remoteVars.last_deleted_elements=0l;
 
     //    EPHYR_DBG("SENDING IMG length - %d, number - %d\n",length,framenum_sent++);
-    ln=write(remoteVars.clientsock_tcp,buffer,56);
+    ln=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
     while(sent<length)
     {
-        l=write(remoteVars.clientsock_tcp,list+sent,((length-sent)<MAXMSGSIZE)?(length-sent):MAXMSGSIZE);
+        l=remote_write_socket(remoteVars.clientsock_tcp,list+sent,((length-sent)<MAXMSGSIZE)?(length-sent):MAXMSGSIZE);
         if(l<0)
         {
             EPHYR_DBG("Error sending list of deleted elements!!!!!");
@@ -685,10 +685,10 @@ int send_deleted_cursors(void)
     remoteVars.last_deleted_cursor=0l;
 
 //    EPHYR_DBG("Sending list from %d elements", deletedcursor_list_size);
-    ln=write(remoteVars.clientsock_tcp,buffer,56);
+    ln=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
     while(sent<length)
     {
-        l=write(remoteVars.clientsock_tcp,list+sent,((length-sent)<MAXMSGSIZE)?(length-sent):MAXMSGSIZE);
+        l=remote_write_socket(remoteVars.clientsock_tcp,list+sent,((length-sent)<MAXMSGSIZE)?(length-sent):MAXMSGSIZE);
         if(l<0)
         {
             EPHYR_DBG("Error sending list of deleted cursors!!!!!");
@@ -729,7 +729,7 @@ void send_reinit_notification(void)
     _X_UNUSED int l;
     *((uint32_t*)buffer)=REINIT;
     EPHYR_DBG("SENDING REINIT NOTIFICATION");
-    l=write(remoteVars.clientsock_tcp,buffer,56);
+    l=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
 }
 
 int send_selection_chunk(int sel, unsigned char* data, uint32_t length, uint32_t format, BOOL first, BOOL last, uint32_t compressed, uint32_t total_sz)
@@ -762,10 +762,10 @@ int send_selection_chunk(int sel, unsigned char* data, uint32_t length, uint32_t
 
 
 
-    ln=write(remoteVars.clientsock_tcp,buffer,56);
+    ln=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
     while(sent<length)
     {
-        l=write(remoteVars.clientsock_tcp,data+sent,((length-sent)<MAXMSGSIZE)?(length-sent):MAXMSGSIZE);
+        l=remote_write_socket(remoteVars.clientsock_tcp,data+sent,((length-sent)<MAXMSGSIZE)?(length-sent):MAXMSGSIZE);
         if(l<0)
         {
             EPHYR_DBG("Error sending selection!!!!!");
@@ -1582,11 +1582,11 @@ void remote_send_win_updates(char* updateBuf, uint32_t bufSize)
     *((uint32_t*)buffer)=WINUPDATE;
     *((uint32_t*)buffer+1)=bufSize;
 
-    l=write(remoteVars.clientsock_tcp,buffer,56);
+    l=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
 
     while(sent<bufSize)
     {
-        l=write(remoteVars.clientsock_tcp,updateBuf+sent,((bufSize-sent)<MAXMSGSIZE)?(bufSize-sent):MAXMSGSIZE);
+        l=remote_write_socket(remoteVars.clientsock_tcp,updateBuf+sent,((bufSize-sent)<MAXMSGSIZE)?(bufSize-sent):MAXMSGSIZE);
         if(l<0)
         {
             EPHYR_DBG("Error sending windows update!!!!!");
@@ -1803,10 +1803,9 @@ void *send_frame_thread (void *threadid)
                     }
                     else
                     {
-                        /* sleep till we have a signal from another thread if
-                         *frame, cursor ,selection queue is empty and all regions are updated*/
+                        /*send server alive event if needed*/
                         ms_to_wait=100*1000; //reset timer
-                        pthread_cond_wait(&remoteVars.have_sendqueue_cond, &remoteVars.sendqueue_mutex);
+                        sendServerAlive();
                     }
                     break;
                 default:
@@ -2191,11 +2190,6 @@ void disconnect_client(void)
         TimerFree(remoteVars.checkKeepAliveTimer);
         remoteVars.checkKeepAliveTimer=0;
     }
-    if(remoteVars.sendKeepAliveTimer)
-    {
-        TimerFree(remoteVars.sendKeepAliveTimer);
-        remoteVars.sendKeepAliveTimer=0;
-    }
     remoteVars.client_connected=FALSE;
     setAgentState(SUSPENDED);
     clean_everything();
@@ -2953,7 +2947,6 @@ void set_client_version(uint16_t ver, uint16_t os)
         //start timer for checking if client alive
         pthread_mutex_lock(&remoteVars.sendqueue_mutex);
         remoteVars.checkKeepAliveTimer=TimerSet(0,0,CLIENTALIVE_TIMEOUT, checkClientAlive, NULL);
-        remoteVars.sendKeepAliveTimer=TimerSet(0,0,SERVERALIVE_TIMEOUT, sendServerAlive, NULL);
         pthread_mutex_unlock(&remoteVars.sendqueue_mutex);
     }
 }
@@ -3180,7 +3173,7 @@ open_udp_socket(void)
     *((uint32_t*)buffer)=UDPOPEN; //4B
     *((uint32_t*)buffer+1)=(uint32_t)remoteVars.udpPort; //4B
     memcpy(buffer+8,tmp_cookie,4*8);
-    write(remoteVars.clientsock_tcp,buffer,56);
+    remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
     memset(fds, 0 , sizeof(fds));
 
     fds[0].fd = remoteVars.sock_udp;
@@ -3224,7 +3217,7 @@ open_udp_socket(void)
     //no connection is established, closing udp socket and sending notification
     close_udp_socket();
     *((uint32_t*)buffer)=UDPFAILED; //4B
-    write(remoteVars.clientsock_tcp,buffer,56);
+    remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
 }
 
 void open_socket(void)
@@ -5250,7 +5243,7 @@ int send_packet_as_datagrams(unsigned char* data, uint32_t length, uint8_t dgTyp
         checksum=crc32(checksum,dgram,dgram_length);
         //setting checksum
         *((uint32_t*)dgram)=checksum;
-        writeRes=write(remoteVars.sock_udp, dgram, dgram_length);
+        writeRes=remote_write_socket(remoteVars.sock_udp, dgram, dgram_length);
         if(writeRes!=(int)dgram_length)
         {
 //             EPHYR_DBG("Warning, sending packet failed. Sent %d bytes instead of %d",writeRes,dgram_length);
@@ -5279,14 +5272,21 @@ checkClientAlive(OsTimerPtr timer, CARD32 time_card, void* args)
     return CLIENTALIVE_TIMEOUT;
 }
 
-unsigned int sendServerAlive(OsTimerPtr timer, CARD32 time_card, void* args)
+void
+sendServerAlive(void)
 {
     unsigned char buffer[56] = {0};
-    _X_UNUSED int l;
-
-    *((uint32_t*)buffer)=SRVKEEPALIVE; //4B
-    l=write(remoteVars.clientsock_tcp,buffer,56);
-    return SERVERALIVE_TIMEOUT;
+    if(remoteVars.client_os==WEB || remoteVars.client_version<3)
+    {
+        //client doesn't support this event
+        return;
+    }
+    if((time(NULL) - remoteVars.lastServerKeepAlive)>=SERVERALIVE_TIMEOUT)
+    {
+        *((uint32_t*)buffer)=SRVKEEPALIVE; //4B
+        remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
+//         EPHYR_DBG("SENDING SRV KEEPALIVE!!!!");
+    }
 }
 
 void
@@ -5298,7 +5298,7 @@ send_srv_disconnect(void)
     if(remoteVars.client_version<3)
         return;
     *((uint32_t*)buffer)=SRVDISCONNECT; //4B
-    l=write(remoteVars.clientsock_tcp,buffer,56);
+    l=remote_write_socket(remoteVars.clientsock_tcp,buffer,56);
 }
 
 void
@@ -5361,3 +5361,9 @@ void close_udp_socket(void)
     }
 }
 
+ssize_t
+remote_write_socket(int fd, const void *buf, size_t count)
+{
+    remoteVars.lastServerKeepAlive=time(NULL);
+    return write(fd,buf,count);
+}
diff --git a/x2gokdriveremote.h b/x2gokdriveremote.h
index 4551ea1..7100bf6 100644
--- a/x2gokdriveremote.h
+++ b/x2gokdriveremote.h
@@ -115,7 +115,7 @@
 
 #define ACCEPT_TIMEOUT 30000 //msec
 #define CLIENTALIVE_TIMEOUT 30000 //msec
-#define SERVERALIVE_TIMEOUT 5000 //msec
+#define SERVERALIVE_TIMEOUT 10 //sec
 
 //if true, will save compressed jpg in file
 #define JPGDEBUG FALSE
@@ -437,7 +437,8 @@ struct remoteWindow
 struct _remoteHostVars
 {
     unsigned char compression;
-    OsTimerPtr checkConnectionTimer, checkKeepAliveTimer, sendKeepAliveTimer;
+    OsTimerPtr checkConnectionTimer, checkKeepAliveTimer;
+    time_t lastServerKeepAlive;
     int agentState;
     BOOL nxagentMode;
     char optionsFile[256];
@@ -644,7 +645,6 @@ void markDirtyRegions(uint32_t x, uint32_t y, uint32_t width, uint32_t height, u
 int getDirtyScreenRegion(void);
 void send_dirty_region(int index);
 unsigned int checkClientAlive(OsTimerPtr timer, CARD32 time_card, void* args);
-unsigned int sendServerAlive(OsTimerPtr timer, CARD32 time_card, void* args);
 void send_srv_disconnect(void);
 BOOL insideOfRegion(struct PaintRectRegion* reg, int x , int y);
 struct PaintRectRegion* findRegionForPoint(struct PaintRectRegion* firstRegion, int x , int y);
@@ -652,4 +652,6 @@ BOOL unitePaintRegions(struct PaintRectRegion* firstRegion);
 //perform cleanup of all caches and queues when disconnecting or performing reinitialization
 void clean_everything(void);
 void resend_frame(uint32_t crc);
+ssize_t remote_write_socket(int fd, const void *buf, size_t count);
+void sendServerAlive(void);
 #endif /* X2GOKDRIVE_REMOTE_H */

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdrive.git


More information about the x2go-commits mailing list