diff options
author | ArvidNorr <norrarvid@gmail.com> | 2012-06-18 00:00:05 -0700 |
---|---|---|
committer | ArvidNorr <norrarvid@gmail.com> | 2012-06-18 00:00:05 -0700 |
commit | d2903cd1fc2f02fd08ea0b55117a3a03e7131504 (patch) | |
tree | 0996897428c35bf52ed179c818e33b1406cd76b5 /common | |
parent | 2509442b361b93578431697a083a2ed186e25146 (diff) | |
parent | e5fb05e9cba476ec67f71fee1d79ddd5cdd12f2c (diff) | |
download | xrdp-proprietary-d2903cd1fc2f02fd08ea0b55117a3a03e7131504.tar.gz xrdp-proprietary-d2903cd1fc2f02fd08ea0b55117a3a03e7131504.zip |
Merge pull request #28 from ArvidNorr/tcp_nodelay
Support for TCP keepalive and TCP no_delay added
Diffstat (limited to 'common')
-rw-r--r-- | common/os_calls.c | 52 | ||||
-rw-r--r-- | common/os_calls.h | 2 |
2 files changed, 51 insertions, 3 deletions
diff --git a/common/os_calls.c b/common/os_calls.c index c713bfaa..8b3e01dc 100644 --- a/common/os_calls.c +++ b/common/os_calls.c @@ -325,9 +325,11 @@ g_getchar(void) } /*****************************************************************************/ +/*Returns 0 on success*/ int APP_CC g_tcp_set_no_delay(int sck) { + int ret = 1 ; /*error*/ #if defined(_WIN32) int option_value; int option_len; @@ -345,11 +347,55 @@ g_tcp_set_no_delay(int sck) { option_value = 1; option_len = sizeof(option_value); - setsockopt(sck, IPPROTO_TCP, TCP_NODELAY, (char*)&option_value, - option_len); + if(setsockopt(sck, IPPROTO_TCP, TCP_NODELAY, (char*)&option_value, + option_len)==0) + { + ret = 0 ; /* success */ + } } } - return 0; + else + { + g_writeln("Error getting tcp_nodelay"); + } + return ret; +} + +/*****************************************************************************/ +/*Returns 0 on success*/ +int APP_CC +g_tcp_set_keepalive(int sck) +{ + int ret = 1 ; /*error*/ +#if defined(_WIN32) + int option_value; + int option_len; +#else + int option_value; + unsigned int option_len; +#endif + + option_len = sizeof(option_value); + /* SOL_TCP IPPROTO_TCP */ + if (getsockopt(sck, SOL_SOCKET, SO_KEEPALIVE, (char*)&option_value, + &option_len) == 0) + { + if (option_value == 0) + { + option_value = 1; + option_len = sizeof(option_value); + if(setsockopt(sck, SOL_SOCKET, SO_KEEPALIVE, (char*)&option_value, + option_len)==0) + { + ret = 0 ; /* success */ + } + } + } + else + { + g_writeln("Error getting tcp_keepalive"); + } + return ret; } /*****************************************************************************/ diff --git a/common/os_calls.h b/common/os_calls.h index 7be659d6..41b221bf 100644 --- a/common/os_calls.h +++ b/common/os_calls.h @@ -64,6 +64,8 @@ g_getchar(void); int APP_CC g_tcp_set_no_delay(int sck); int APP_CC +g_tcp_set_keepalive(int sck); +int APP_CC g_tcp_socket(void); int APP_CC g_tcp_local_socket(void); |