diff --git a/src/main.cpp b/src/main.cpp index 98fe66322..0f133dfa3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -939,6 +939,11 @@ int main(int argc, char *argv[]) audio_host = requested_receiver; } + if (!is_ipv6_supported()) { + log_msg(LOG_LEVEL_WARNING, "IPv6 support missing, setting IPv4-only mode.\n"); + force_ip_version = 4; + } + if (!set_output_buffering()) { log_msg(LOG_LEVEL_WARNING, "Cannot set console output buffering!\n"); } diff --git a/src/utils/net.c b/src/utils/net.c index 3c853e0c6..63888e95e 100644 --- a/src/utils/net.c +++ b/src/utils/net.c @@ -297,3 +297,13 @@ bool get_local_addresses(struct sockaddr_storage *addrs, size_t *len, int ip_ver #endif } +bool is_ipv6_supported(void) +{ + int fd = socket(AF_INET6, SOCK_DGRAM, 0); + if (fd == INVALID_SOCKET && errno == EAFNOSUPPORT) { + return false; + } + CLOSESOCKET(fd); + return true; +} + diff --git a/src/utils/net.h b/src/utils/net.h index 720b1befa..826e69ffa 100644 --- a/src/utils/net.h +++ b/src/utils/net.h @@ -48,6 +48,7 @@ bool is_addr_loopback(struct sockaddr *sa); bool is_host_loopback(const char *hostname); uint16_t socket_get_recv_port(int fd); bool get_local_addresses(struct sockaddr_storage *addrs, size_t *len, int ip_version); +bool is_ipv6_supported(void); #ifdef WIN32 #define CLOSESOCKET closesocket