Initial implementation of timeout.

This commit is contained in:
Michael Jumper 2011-03-15 23:02:47 -07:00
parent 5a46330332
commit a9f702ed27
2 changed files with 72 additions and 3 deletions

View File

@ -57,6 +57,29 @@
*/ */
#define GUAC_SYNC_THRESHOLD 500 #define GUAC_SYNC_THRESHOLD 500
/**
* The time to allow between server sync messages in milliseconds. A sync
* message from the server will be sent every GUAC_SYNC_FREQUENCY milliseconds.
* As this will induce a response from a client that is not malfunctioning,
* this is used to detect when a client has died. This must be set to a
* reasonable value to avoid clients being disconnected unnecessarily due
* to timeout.
*/
#define GUAC_SYNC_FREQUENCY 5000
/**
* The number of milliseconds to wait for messages in any phase before
* timing out and closing the connection with an error.
*/
#define GUAC_TIMEOUT 15000
/**
* The number of microseconds to wait for messages in any phase before
* timing out and closing the conncetion with an error. This is always
* equal to GUAC_TIMEOUT * 1000.
*/
#define GUAC_USEC_TIMEOUT (GUAC_TIMEOUT*1000)
/** /**
* The amount of time to wait after handling server messages. If a client * The amount of time to wait after handling server messages. If a client
* plugin has a message handler, and sends instructions when server messages * plugin has a message handler, and sends instructions when server messages

View File

@ -119,9 +119,24 @@ guac_client* guac_get_client(int client_fd) {
/* Wait for select instruction */ /* Wait for select instruction */
for (;;) { for (;;) {
int result = guac_read_instruction(io, &instruction); int result;
/* Wait for data until timeout */
result = guac_select(io, GUAC_USEC_TIMEOUT);
if (result == 0) {
guac_send_error(io, "Select timeout.");
guac_close(io);
return NULL;
}
/* If error occurs while waiting, exit with failure */
if (result < 0) {
guac_close(io);
return NULL;
}
result = guac_read_instruction(io, &instruction);
if (result < 0) { if (result < 0) {
GUAC_LOG_ERROR("Error reading instruction while waiting for select");
guac_close(io); guac_close(io);
return NULL; return NULL;
} }
@ -194,7 +209,23 @@ guac_client* guac_get_client(int client_fd) {
/* Wait for connect instruction */ /* Wait for connect instruction */
for (;;) { for (;;) {
int result = guac_read_instruction(io, &instruction); int result;
/* Wait for data until timeout */
result = guac_select(io, GUAC_USEC_TIMEOUT);
if (result == 0) {
guac_send_error(io, "Connect timeout.");
guac_close(io);
return NULL;
}
/* If error occurs while waiting, exit with failure */
if (result < 0) {
guac_close(io);
return NULL;
}
result = guac_read_instruction(io, &instruction);
if (result < 0) { if (result < 0) {
GUAC_LOG_ERROR("Error reading instruction while waiting for connect"); GUAC_LOG_ERROR("Error reading instruction while waiting for connect");
guac_close(io); guac_close(io);
@ -308,6 +339,21 @@ void guac_start_client(guac_client* client) {
/* VNC Client Loop */ /* VNC Client Loop */
for (;;) { for (;;) {
/* Get current time and check timeout */
long timestamp = __guac_current_timestamp();
if (timestamp - last_received_timestamp > GUAC_TIMEOUT) {
guac_send_error(io, "Sync timeout.");
guac_flush(io);
return;
}
/* If not timed out, ping client with sync */
if (timestamp - last_sent_timestamp > GUAC_SYNC_FREQUENCY) {
last_sent_timestamp = timestamp;
guac_send_sync(io, last_sent_timestamp);
guac_flush(io);
}
/* Handle server messages */ /* Handle server messages */
if (client->handle_messages) { if (client->handle_messages) {