summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllen.Dou <allen.dou@hotmail.com>2013-04-19 11:26:43 +0800
committerAllen.Dou <allen.dou@hotmail.com>2013-04-19 11:26:43 +0800
commit8d5bc445e53ad4114aaac1dd4ff438b638aecede (patch)
tree954721752933c9aebd10bbe0da8cfd6e9e794c8e
parent63ce20dd15f83c6ff2bdab1bf3dcd1866e826c71 (diff)
SetKeepAlive
Keep client alive even though no command was sent to server for a long time.
-rw-r--r--hiredis.h2
-rw-r--r--net.c34
2 files changed, 36 insertions, 0 deletions
diff --git a/hiredis.h b/hiredis.h
index aadcf35..a861761 100644
--- a/hiredis.h
+++ b/hiredis.h
@@ -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
diff --git a/net.c b/net.c
index a495715..57557cd 100644
--- a/net.c
+++ b/net.c
@@ -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;