mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
anet.c: new API anetTcpNonBlockBestEffortBindConnect()
This performs a best effort source address binding attempt. If it is possible to bind the local address and still have a successful connect(), then this socket is returned. Otherwise the call is retried without source address binding attempt. Related to issues #2609 and #2612.
This commit is contained in:
parent
8fa8b251a9
commit
a017b7ec0e
22
src/anet.c
22
src/anet.c
@ -264,6 +264,7 @@ static int anetCreateSocket(char *err, int domain) {
|
|||||||
|
|
||||||
#define ANET_CONNECT_NONE 0
|
#define ANET_CONNECT_NONE 0
|
||||||
#define ANET_CONNECT_NONBLOCK 1
|
#define ANET_CONNECT_NONBLOCK 1
|
||||||
|
#define ANET_CONNECT_BE_BINDING 2 /* Best effort binding. */
|
||||||
static int anetTcpGenericConnect(char *err, char *addr, int port,
|
static int anetTcpGenericConnect(char *err, char *addr, int port,
|
||||||
char *source_addr, int flags)
|
char *source_addr, int flags)
|
||||||
{
|
{
|
||||||
@ -331,9 +332,17 @@ error:
|
|||||||
close(s);
|
close(s);
|
||||||
s = ANET_ERR;
|
s = ANET_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
freeaddrinfo(servinfo);
|
freeaddrinfo(servinfo);
|
||||||
|
|
||||||
|
/* Handle best effort binding: if a binding address was used, but it is
|
||||||
|
* not possible to create a socket, try again without a binding address. */
|
||||||
|
if (s == ANET_ERR && source_addr && (flags & ANET_CONNECT_BE_BINDING)) {
|
||||||
|
return anetTcpGenericConnect(err,addr,port,NULL,flags);
|
||||||
|
} else {
|
||||||
return s;
|
return s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int anetTcpConnect(char *err, char *addr, int port)
|
int anetTcpConnect(char *err, char *addr, int port)
|
||||||
@ -346,9 +355,18 @@ int anetTcpNonBlockConnect(char *err, char *addr, int port)
|
|||||||
return anetTcpGenericConnect(err,addr,port,NULL,ANET_CONNECT_NONBLOCK);
|
return anetTcpGenericConnect(err,addr,port,NULL,ANET_CONNECT_NONBLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
int anetTcpNonBlockBindConnect(char *err, char *addr, int port, char *source_addr)
|
int anetTcpNonBlockBindConnect(char *err, char *addr, int port,
|
||||||
|
char *source_addr)
|
||||||
{
|
{
|
||||||
return anetTcpGenericConnect(err,addr,port,source_addr,ANET_CONNECT_NONBLOCK);
|
return anetTcpGenericConnect(err,addr,port,source_addr,
|
||||||
|
ANET_CONNECT_NONBLOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
int anetTcpNonBlockBestEffortBindConnect(char *err, char *addr, int port,
|
||||||
|
char *source_addr)
|
||||||
|
{
|
||||||
|
return anetTcpGenericConnect(err,addr,port,source_addr,
|
||||||
|
ANET_CONNECT_NONBLOCK|ANET_CONNECT_BE_BINDING);
|
||||||
}
|
}
|
||||||
|
|
||||||
int anetUnixGenericConnect(char *err, char *path, int flags)
|
int anetUnixGenericConnect(char *err, char *path, int flags)
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
int anetTcpConnect(char *err, char *addr, int port);
|
int anetTcpConnect(char *err, char *addr, int port);
|
||||||
int anetTcpNonBlockConnect(char *err, char *addr, int port);
|
int anetTcpNonBlockConnect(char *err, char *addr, int port);
|
||||||
int anetTcpNonBlockBindConnect(char *err, char *addr, int port, char *source_addr);
|
int anetTcpNonBlockBindConnect(char *err, char *addr, int port, char *source_addr);
|
||||||
|
int anetTcpNonBlockBestEffortBindConnect(char *err, char *addr, int port, char *source_addr);
|
||||||
int anetUnixConnect(char *err, char *path);
|
int anetUnixConnect(char *err, char *path);
|
||||||
int anetUnixNonBlockConnect(char *err, char *path);
|
int anetUnixNonBlockConnect(char *err, char *path);
|
||||||
int anetRead(int fd, char *buf, int count);
|
int anetRead(int fd, char *buf, int count);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user