This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch feature/udp-support in repository x2gokdrive. from 95fac65 Establishing UDP connection. new e416ef0 Sending server keep alive event from sendframe thread. The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: x2gokdriveremote.c | 76 +++++++++++++++++++++++++++++------------------------- x2gokdriveremote.h | 8 +++--- 2 files changed, 46 insertions(+), 38 deletions(-) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdrive.git
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@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