VNC: Enable receive timeouts during negotiation phase

This commit is contained in:
Gregory Nutt 2016-04-19 06:59:33 -06:00
parent 1ae24ddf77
commit fdc6dd9516
2 changed files with 71 additions and 0 deletions

View File

@ -45,6 +45,10 @@
#include <assert.h> #include <assert.h>
#include <debug.h> #include <debug.h>
#ifdef CONFIG_NET_SOCKOPTS
# include <sys/time.h>
#endif
#include <nuttx/video/fb.h> #include <nuttx/video/fb.h>
#include <nuttx/video/rfb.h> #include <nuttx/video/rfb.h>
@ -92,6 +96,27 @@ int vnc_negotiate(FAR struct vnc_session_s *session)
size_t len; size_t len;
int errcode; int errcode;
#ifdef CONFIG_NET_SOCKOPTS
struct timeval tv;
int ret;
/* Set a receive timeout so that we don't hang if the client does not
* respond according to RFB 3.3 protocol.
*/
tv.tv_sec = 5;
tv.tv_usec = 0;
ret = psock_setsockopt(&session->connect, SOL_SOCKET, SO_RCVTIMEO,
&tv, sizeof(struct timeval));
if (ret < 0)
{
errcode = get_errno();
gdbg("ERROR: Failed to set receive timeout: %d\n", errcode);
DEBUGASSERT(errcode > 0);
return -errcode;
}
#endif
/* Inform the client of the VNC protocol version */ /* Inform the client of the VNC protocol version */
gvdbg("Send protocol version: %s\n", g_vncproto); gvdbg("Send protocol version: %s\n", g_vncproto);
@ -302,6 +327,27 @@ int vnc_negotiate(FAR struct vnc_session_s *session)
ssize_t nrecvd; ssize_t nrecvd;
size_t len; size_t len;
#ifdef CONFIG_NET_SOCKOPTS
struct timeval tv;
int ret;
/* Set a receive timeout so that we don't hang if the client does not
* respond according to RFB 3.3 protocol.
*/
tv.tv_sec = 5;
tv.tv_usec = 0;
ret = psock_setsockopt(&session->connect, SOL_SOCKET, SO_RCVTIMEO,
&tv, sizeof(struct timeval));
if (ret < 0)
{
errcode = get_errno();
gdbg("ERROR: Failed to set receive timeout: %d\n", errcode);
DEBUGASSERT(errcode > 0);
return -errcode;
}
#endif
/* Inform the client of the VNC protocol version */ /* Inform the client of the VNC protocol version */
len = strlen(g_vncproto); len = strlen(g_vncproto);

View File

@ -43,6 +43,10 @@
#include <errno.h> #include <errno.h>
#include <debug.h> #include <debug.h>
#ifdef CONFIG_NET_SOCKOPTS
# include <sys/time.h>
#endif
#include <nuttx/net/net.h> #include <nuttx/net/net.h>
#include <nuttx/video/rfb.h> #include <nuttx/video/rfb.h>
@ -115,6 +119,9 @@ int vnc_read_remainder(FAR struct vnc_session_s *session, size_t msglen,
int vnc_receiver(FAR struct vnc_session_s *session) int vnc_receiver(FAR struct vnc_session_s *session)
{ {
#ifdef CONFIG_NET_SOCKOPTS
struct timeval tv;
#endif
ssize_t nrecvd; ssize_t nrecvd;
int errcode; int errcode;
int ret; int ret;
@ -122,6 +129,24 @@ int vnc_receiver(FAR struct vnc_session_s *session)
DEBUGASSERT(session); DEBUGASSERT(session);
gvdbg("Receiver running for Display %d\n", session->display); gvdbg("Receiver running for Display %d\n", session->display);
#ifdef CONFIG_NET_SOCKOPTS
/* Disable the receive timeout so that we will wait indefinitely for the
* next Client-to-Server message.
*/
tv.tv_sec = 0;
tv.tv_usec = 0;
ret = psock_setsockopt(&session->connect, SOL_SOCKET, SO_RCVTIMEO,
&tv, sizeof(struct timeval));
if (ret < 0)
{
errcode = get_errno();
gdbg("ERROR: Failed to disable receive timeout: %d\n", errcode);
DEBUGASSERT(errcode > 0);
return -errcode;
}
#endif
/* Loop until the client disconnects or an unhandled error occurs */ /* Loop until the client disconnects or an unhandled error occurs */
for (; ; ) for (; ; )