Created
July 3, 2014 11:12
-
-
Save Charles0429/106553afa21433b00459 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int redisContextConnectTcp(redisContext *c, const char *addr, int port, struct timeval *timeout) { | |
int s, rv; | |
char _port[6]; /* strlen("65535"); */ | |
struct addrinfo hints, *servinfo, *p; | |
int blocking = (c->flags & REDIS_BLOCK); | |
snprintf(_port, 6, "%d", port); | |
memset(&hints,0,sizeof(hints)); | |
hints.ai_family = AF_INET; | |
hints.ai_socktype = SOCK_STREAM; | |
if ((rv = getaddrinfo(addr,_port,&hints,&servinfo)) != 0) { | |
__redisSetError(c,REDIS_ERR_OTHER,gai_strerror(rv)); | |
return REDIS_ERR; | |
} | |
for (p = servinfo; p != NULL; p = p->ai_next) { | |
if ((s = socket(p->ai_family,p->ai_socktype,p->ai_protocol)) == -1) | |
continue; | |
if (redisSetBlocking(c,s,0) != REDIS_OK) | |
goto error; | |
if (connect(s,p->ai_addr,p->ai_addrlen) == -1) { | |
if (errno == EHOSTUNREACH) { | |
close(s); | |
continue; | |
} else if (errno == EINPROGRESS && !blocking) { | |
/* This is ok. */ | |
} else { | |
if (redisContextWaitReady(c,s,timeout) != REDIS_OK) | |
goto error; | |
} | |
} | |
if (blocking && redisSetBlocking(c,s,1) != REDIS_OK) | |
goto error; | |
if (redisSetTcpNoDelay(c,s) != REDIS_OK) | |
goto error; | |
c->fd = s; | |
c->flags |= REDIS_CONNECTED; | |
rv = REDIS_OK; | |
goto end; | |
} | |
if (p == NULL) { | |
char buf[128]; | |
snprintf(buf,sizeof(buf),"Can't create socket: %s",strerror(errno)); | |
__redisSetError(c,REDIS_ERR_OTHER,buf); | |
goto error; | |
} | |
error: | |
rv = REDIS_ERR; | |
end: | |
freeaddrinfo(servinfo); | |
return rv; // Need to return REDIS_OK if alright | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment