From ab1762cd92845a75663c9046a6c039cd9757eb39 Mon Sep 17 00:00:00 2001 From: Sangmoon Yi Date: Mon, 12 Aug 2019 10:54:12 +0900 Subject: fix timeout code in windows --- net.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'net.c') diff --git a/net.c b/net.c index ac304b4..6e7ac82 100644 --- a/net.c +++ b/net.c @@ -310,11 +310,18 @@ int redisCheckSocketError(redisContext *c) { } int redisContextSetTimeout(redisContext *c, const struct timeval tv) { - if (setsockopt(c->fd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv)) == -1) { + const void *to_ptr = &tv; + size_t to_sz = sizeof(tv); +#ifdef _WIN32 + DWORD timeout_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000; + to_ptr = &timeout_msec; + to_sz = sizeof(timeout_msec); +#endif + if (setsockopt(c->fd,SOL_SOCKET,SO_RCVTIMEO,to_ptr,to_sz) == -1) { __redisSetErrorFromErrno(c,REDIS_ERR_IO,"setsockopt(SO_RCVTIMEO)"); return REDIS_ERR; } - if (setsockopt(c->fd,SOL_SOCKET,SO_SNDTIMEO,&tv,sizeof(tv)) == -1) { + if (setsockopt(c->fd,SOL_SOCKET,SO_SNDTIMEO,to_ptr,to_sz) == -1) { __redisSetErrorFromErrno(c,REDIS_ERR_IO,"setsockopt(SO_SNDTIMEO)"); return REDIS_ERR; } -- cgit v1.2.3 From 8e61d5737a9123549298582a7b98207e2acd7f7c Mon Sep 17 00:00:00 2001 From: Sangmoon Yi Date: Mon, 12 Aug 2019 10:55:08 +0900 Subject: add recv error code for clarifying timeout --- net.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'net.c') diff --git a/net.c b/net.c index 6e7ac82..7cbfd32 100644 --- a/net.c +++ b/net.c @@ -63,6 +63,10 @@ int redisNetRead(redisContext *c, char *buf, size_t bufcap) { if ((errno == EWOULDBLOCK && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) { /* Try again later */ return 0; + } else if(errno == ETIMEDOUT && (c->flags & REDIS_BLOCK)) { + /* especially in windows */ + __redisSetError(c, REDIS_ERR_TIMEOUT, "recv timeout"); + return -1; } else { __redisSetError(c, REDIS_ERR_IO, NULL); return -1; -- cgit v1.2.3