mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-11 18:35:46 +02:00
feat(server): Support IPv6 addresses for replication (#1087)
* feat(server): Support IPv6 addresses for replication * break earlier on IPv4
This commit is contained in:
parent
e17fb41dee
commit
cb17f92ad8
1 changed files with 20 additions and 7 deletions
|
@ -61,21 +61,34 @@ int ResolveDns(std::string_view host, char* dest) {
|
|||
|
||||
static_assert(INET_ADDRSTRLEN < INET6_ADDRSTRLEN, "");
|
||||
|
||||
res = EAI_FAMILY;
|
||||
// If possible, we want to use an IPv4 address.
|
||||
char ipv4_addr[INET6_ADDRSTRLEN];
|
||||
bool found_ipv4 = false;
|
||||
char ipv6_addr[INET6_ADDRSTRLEN];
|
||||
bool found_ipv6 = false;
|
||||
|
||||
for (addrinfo* p = servinfo; p != NULL; p = p->ai_next) {
|
||||
if (p->ai_family == AF_INET) {
|
||||
CHECK(p->ai_family == AF_INET || p->ai_family == AF_INET6);
|
||||
if (p->ai_family == AF_INET && !found_ipv4) {
|
||||
struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr;
|
||||
const char* inet_res = inet_ntop(p->ai_family, &ipv4->sin_addr, dest, INET6_ADDRSTRLEN);
|
||||
CHECK_NOTNULL(inet_res);
|
||||
res = 0;
|
||||
CHECK(nullptr !=
|
||||
inet_ntop(p->ai_family, (void*)&ipv4->sin_addr, ipv4_addr, INET6_ADDRSTRLEN));
|
||||
found_ipv4 = true;
|
||||
break;
|
||||
} else if (!found_ipv6) {
|
||||
struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr;
|
||||
CHECK(nullptr !=
|
||||
inet_ntop(p->ai_family, (void*)&ipv6->sin6_addr, ipv6_addr, INET6_ADDRSTRLEN));
|
||||
found_ipv6 = true;
|
||||
}
|
||||
LOG(WARNING) << "Only IPv4 is supported";
|
||||
}
|
||||
|
||||
CHECK(found_ipv4 || found_ipv6);
|
||||
memcpy(dest, found_ipv4 ? ipv4_addr : ipv6_addr, INET6_ADDRSTRLEN);
|
||||
|
||||
freeaddrinfo(servinfo);
|
||||
|
||||
return res;
|
||||
return 0;
|
||||
}
|
||||
|
||||
error_code Recv(FiberSocketBase* input, base::IoBuf* dest) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue