Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
hiredis
Commits
10c78c6e
Commit
10c78c6e
authored
Sep 01, 2022
by
Viktor Söderqvist
Committed by
Michael Grunder
Sep 01, 2022
Browse files
Add possibility to prefer IPv6, IPv4 or unspecified
parent
1abe0c82
Changes
3
Show whitespace changes
Inline
Side-by-side
hiredis.c
View file @
10c78c6e
...
@@ -814,6 +814,12 @@ redisContext *redisConnectWithOptions(const redisOptions *options) {
...
@@ -814,6 +814,12 @@ redisContext *redisConnectWithOptions(const redisOptions *options) {
if
(
options
->
options
&
REDIS_OPT_NOAUTOFREEREPLIES
)
{
if
(
options
->
options
&
REDIS_OPT_NOAUTOFREEREPLIES
)
{
c
->
flags
|=
REDIS_NO_AUTO_FREE_REPLIES
;
c
->
flags
|=
REDIS_NO_AUTO_FREE_REPLIES
;
}
}
if
(
options
->
options
&
REDIS_OPT_PREFER_IPV4
)
{
c
->
flags
|=
REDIS_PREFER_IPV4
;
}
if
(
options
->
options
&
REDIS_OPT_PREFER_IPV6
)
{
c
->
flags
|=
REDIS_PREFER_IPV6
;
}
/* Set any user supplied RESP3 PUSH handler or use freeReplyObject
/* Set any user supplied RESP3 PUSH handler or use freeReplyObject
* as a default unless specifically flagged that we don't want one. */
* as a default unless specifically flagged that we don't want one. */
...
...
hiredis.h
View file @
10c78c6e
...
@@ -92,6 +92,11 @@ typedef long long ssize_t;
...
@@ -92,6 +92,11 @@ typedef long long ssize_t;
/* Flag that indicates the user does not want replies to be automatically freed */
/* Flag that indicates the user does not want replies to be automatically freed */
#define REDIS_NO_AUTO_FREE_REPLIES 0x400
#define REDIS_NO_AUTO_FREE_REPLIES 0x400
/* Flags to prefer IPv6 or IPv4 when doing DNS lookup. (If both are set,
* AF_UNSPEC is used.) */
#define REDIS_PREFER_IPV4 0x800
#define REDIS_PREFER_IPV6 0x1000
#define REDIS_KEEPALIVE_INTERVAL 15
/* seconds */
#define REDIS_KEEPALIVE_INTERVAL 15
/* seconds */
/* number of times we retry to connect in the case of EADDRNOTAVAIL and
/* number of times we retry to connect in the case of EADDRNOTAVAIL and
...
@@ -149,6 +154,8 @@ struct redisSsl;
...
@@ -149,6 +154,8 @@ struct redisSsl;
#define REDIS_OPT_NONBLOCK 0x01
#define REDIS_OPT_NONBLOCK 0x01
#define REDIS_OPT_REUSEADDR 0x02
#define REDIS_OPT_REUSEADDR 0x02
#define REDIS_OPT_PREFER_IPV4 0x04
#define REDIS_OPT_PREFER_IPV6 0x08
/**
/**
* Don't automatically free the async object on a connection failure,
* Don't automatically free the async object on a connection failure,
...
...
net.c
View file @
10c78c6e
...
@@ -439,17 +439,25 @@ static int _redisContextConnectTcp(redisContext *c, const char *addr, int port,
...
@@ -439,17 +439,25 @@ static int _redisContextConnectTcp(redisContext *c, const char *addr, int port,
hints
.
ai_family
=
AF_INET
;
hints
.
ai_family
=
AF_INET
;
hints
.
ai_socktype
=
SOCK_STREAM
;
hints
.
ai_socktype
=
SOCK_STREAM
;
/*
Try with IPv6 if no IPv4 address was found. We do it in this order since
/*
DNS lookup. To use dual stack, set both flags to prefer both IPv4 and
*
in a Redis client you can't afford to test if you have IPv6 connectivity
*
IPv6. By default, for historical reasons, we try IPv4 first and then we
*
as this would add latency to every connect. Otherwise a more sensible
*
try IPv6 only if no IPv4 address was found. */
* route could be: Use
IP
v
6
if both addresses are available and there is IPv6
if
(
c
->
flags
&
REDIS_PREFER_
IP
V
6
&&
c
->
flags
&
REDIS_PREFER_IPV4
)
* connectivity. */
hints
.
ai_family
=
AF_UNSPEC
;
if
((
rv
=
getaddrinfo
(
c
->
tcp
.
host
,
_port
,
&
hints
,
&
servinfo
))
!=
0
)
{
else
if
(
c
->
flags
&
REDIS_PREFER_IPV6
)
hints
.
ai_family
=
AF_INET6
;
hints
.
ai_family
=
AF_INET6
;
if
((
rv
=
getaddrinfo
(
addr
,
_port
,
&
hints
,
&
servinfo
))
!=
0
)
{
else
__redisSetError
(
c
,
REDIS_ERR_OTHER
,
gai_strerror
(
rv
));
hints
.
ai_family
=
AF_INET
;
return
REDIS_ERR
;
rv
=
getaddrinfo
(
c
->
tcp
.
host
,
_port
,
&
hints
,
&
servinfo
);
if
(
rv
!=
0
&&
hints
.
ai_family
!=
AF_UNSPEC
)
{
/* Try again with the other IP version. */
hints
.
ai_family
=
(
hints
.
ai_family
==
AF_INET
)
?
AF_INET6
:
AF_INET
;
rv
=
getaddrinfo
(
c
->
tcp
.
host
,
_port
,
&
hints
,
&
servinfo
);
}
}
if
(
rv
!=
0
)
{
__redisSetError
(
c
,
REDIS_ERR_OTHER
,
gai_strerror
(
rv
));
return
REDIS_ERR
;
}
}
for
(
p
=
servinfo
;
p
!=
NULL
;
p
=
p
->
ai_next
)
{
for
(
p
=
servinfo
;
p
!=
NULL
;
p
=
p
->
ai_next
)
{
addrretry:
addrretry:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment