From 74e9bc3826aaec3b5a90e077fbed19a7c798edda Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 31 Jan 2022 12:50:52 +0000 Subject: [PATCH] added qse_set_sck_keepalive() --- qse/include/qse/si/sck.h | 8 ++++++++ qse/lib/si/sck.c | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/qse/include/qse/si/sck.h b/qse/include/qse/si/sck.h index a8e2b339..3433d22b 100644 --- a/qse/include/qse/si/sck.h +++ b/qse/include/qse/si/sck.h @@ -121,6 +121,14 @@ QSE_EXPORT int qse_fini_sck_conn ( qse_sck_hnd_t handle ); +QSE_EXPORT int qse_set_sck_keepalive ( + qse_sck_hnd_t handle, + int enabled, + int tcp_keepidle, + int tcp_keepintvl, + int tcp_keepcnt +); + #if defined(__cplusplus) } #endif diff --git a/qse/lib/si/sck.c b/qse/lib/si/sck.c index ce2fdf3b..4f35fe24 100644 --- a/qse/lib/si/sck.c +++ b/qse/lib/si/sck.c @@ -343,6 +343,25 @@ int qse_fini_sck_conn (qse_sck_hnd_t handle) return 1; /* connected */ } +int qse_set_sck_keepalive (qse_sck_hnd_t handle, int enabled, int tcp_keepidle, int tcp_keepintvl, int tcp_keepcnt) +{ + if (setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, (char*)&enabled, QSE_SIZEOF(enabled)) <= -1) return -1; + + // the following values are just hints. + // i don't care about success and failure +#if defined(TCP_KEEPIDLE) && defined(SOL_TCP) + if (tcp_keepidle > 0) setsockopt (handle, SOL_TCP, TCP_KEEPIDLE, (char*)&tcp_keepidle, QSE_SIZEOF(tcp_keepidle)); +#endif +#if defined(TCP_KEEPINTVL) && defined(SOL_TCP) + if (tcp_keepintvl > 0) setsockopt (handle, SOL_TCP, TCP_KEEPINTVL, (char*)&tcp_keepintvl, QSE_SIZEOF(tcp_keepintvl)); +#endif +#if defined(TCP_KEEPCNT) && defined(SOL_TCP) + if (tcp_keepcnt > 0) setsockopt (handle, SOL_TCP, TCP_KEEPCNT, (char*)&tcp_keepcnt, QSE_SIZEOF(tcp_keepcnt)); +#endif + return 0; +} + + #if 0 qse_sck_hnd_t