diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index ff88ce5a2d2a2..4af232f429167 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -835,11 +835,12 @@ protocol_version_min (Protocol version minimum) int 1 1 65535 # Files that are not present will be fetched the usual way. remote_media (Remote media) string -# Enable/disable running an IPv6 server. +# Enable IPv6 support for server. +# Note that clients will be able to connect with both IPv4 and IPv6. # Ignored if bind_address is set. # # Requires: enable_ipv6 -ipv6_server (IPv6 server) bool false +ipv6_server (IPv6 server) bool true [*Server Security] diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index ff325a8ff7fe3..b5e9a203bee74 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -422,7 +422,7 @@ void set_default_settings() // Network settings->setDefault("enable_ipv6", "true"); - settings->setDefault("ipv6_server", "false"); + settings->setDefault("ipv6_server", "true"); settings->setDefault("max_packets_per_iteration", "1024"); settings->setDefault("port", "30000"); settings->setDefault("strict_protocol_version_checking", "false"); diff --git a/src/network/socket.cpp b/src/network/socket.cpp index 112230f0082f4..397b5ea51347f 100644 --- a/src/network/socket.cpp +++ b/src/network/socket.cpp @@ -87,25 +87,16 @@ bool UDPSocket::init(bool ipv6, bool noExceptions) m_handle = socket(m_addr_family, SOCK_DGRAM, IPPROTO_UDP); if (m_handle < 0) { - if (noExceptions) { + auto msg = std::string("Failed to create socket: ") + + SOCKET_ERR_STR(LAST_SOCKET_ERR()); + verbosestream << msg << std::endl; + if (noExceptions) return false; - } - - throw SocketException(std::string("Failed to create socket: error ") + - SOCKET_ERR_STR(LAST_SOCKET_ERR())); + throw SocketException(msg); } setTimeoutMs(0); - if (m_addr_family == AF_INET6) { - // Allow our socket to accept both IPv4 and IPv6 connections - // required on Windows: - // https://msdn.microsoft.com/en-us/library/windows/desktop/bb513665(v=vs.85).aspx - int value = 0; - setsockopt(m_handle, IPPROTO_IPV6, IPV6_V6ONLY, - reinterpret_cast<char *>(&value), sizeof(value)); - } - return true; } @@ -129,6 +120,20 @@ void UDPSocket::Bind(Address addr) throw SocketException(errmsg); } + if (m_addr_family == AF_INET6) { + // Allow our socket to accept both IPv4 and IPv6 connections + // required on Windows: + // <https://msdn.microsoft.com/en-us/library/windows/desktop/bb513665(v=vs.85).aspx> + int value = 0; + if (setsockopt(m_handle, IPPROTO_IPV6, IPV6_V6ONLY, + reinterpret_cast<char *>(&value), sizeof(value)) != 0) { + auto errmsg = SOCKET_ERR_STR(LAST_SOCKET_ERR()); + errorstream << "Failed to disable V6ONLY: " << errmsg + << "\nTry disabling ipv6_server to fix this." << std::endl; + throw SocketException(errmsg); + } + } + int ret = 0; if (m_addr_family == AF_INET6) {