[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