diff options
author | Allen.Dou <allen.dou@hotmail.com> | 2013-04-19 11:26:43 +0800 |
---|---|---|
committer | Allen.Dou <allen.dou@hotmail.com> | 2013-04-19 11:26:43 +0800 |
commit | 8d5bc445e53ad4114aaac1dd4ff438b638aecede (patch) | |
tree | 954721752933c9aebd10bbe0da8cfd6e9e794c8e | |
parent | 63ce20dd15f83c6ff2bdab1bf3dcd1866e826c71 (diff) |
SetKeepAlive
Keep client alive even though no command was sent to server for a long time.
-rw-r--r-- | hiredis.h | 2 | ||||
-rw-r--r-- | net.c | 34 |
2 files changed, 36 insertions, 0 deletions
@@ -88,6 +88,8 @@ #define REDIS_READER_MAX_BUF (1024*16) /* Default max unused reader buffer. */ +#define REDIS_KEEPALIVE_INTERVAL 15 /* seconds */ + #ifdef __cplusplus extern "C" { #endif @@ -113,6 +113,38 @@ static int redisSetBlocking(redisContext *c, int fd, int blocking) { return REDIS_OK; } +static int redisKeepAlive(redisContext *c,int fd,int interval) { + int val = 1; + + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) == -1){ + __redisSetError(c,REDIS_ERR_OTHER,strerror(errno)); + return REDIS_ERR; + } + + val = interval; + if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) < 0) { + __redisSetError(c,REDIS_ERR_OTHER,strerror(errno)); + return REDIS_ERR; + } + + val = interval/3; + if (val == 0) val = 1; + if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0) { + __redisSetError(c,REDIS_ERR_OTHER,strerror(errno)); + return REDIS_ERR; + } + + val = 3; + if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0) { + __redisSetError(c,REDIS_ERR_OTHER,strerror(errno)); + return REDIS_ERR; + } + + return REDIS_OK; +} + + + static int redisSetTcpNoDelay(redisContext *c, int fd) { int yes = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes)) == -1) { @@ -241,6 +273,8 @@ int redisContextConnectTcp(redisContext *c, const char *addr, int port, struct t goto error; if (redisSetTcpNoDelay(c,s) != REDIS_OK) goto error; + if (redisKeepAlive(c,s,REDIS_KEEPALIVE_INTERVAL) != REDIS_OK) + goto error; c->fd = s; c->flags |= REDIS_CONNECTED; |