diff --git a/NEWS b/NEWS index 7576ba07..11f6dcb0 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,8 @@ * Fixed #1877 - Avoid terminating connections prematurely +* Fixed #1887 - zmq_bind IPv4 fallback still tries IPv6 + 0MQ version 4.1.4 stable, released on 2015/12/18 ================================================ diff --git a/src/tcp_connecter.cpp b/src/tcp_connecter.cpp index fdbc45c2..75c049e9 100644 --- a/src/tcp_connecter.cpp +++ b/src/tcp_connecter.cpp @@ -235,6 +235,21 @@ int zmq::tcp_connecter_t::open () // Create the socket. s = open_socket (tcp_addr->family (), SOCK_STREAM, IPPROTO_TCP); + + // IPv6 address family not supported, try automatic downgrade to IPv4. + if (s == -1 && tcp_addr->family () == AF_INET6 + && errno == EAFNOSUPPORT + && options.ipv6) { + rc = addr->resolved.tcp_addr->resolve ( + addr->address.c_str (), false, false); + if (rc != 0) { + delete addr->resolved.tcp_addr; + addr->resolved.tcp_addr = NULL; + return -1; + } + s = open_socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); + } + #ifdef ZMQ_HAVE_WINDOWS if (s == INVALID_SOCKET) { errno = wsa_error_to_errno (WSAGetLastError ()); diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp index 05171b35..4e283c95 100644 --- a/src/tcp_listener.cpp +++ b/src/tcp_listener.cpp @@ -167,19 +167,15 @@ int zmq::tcp_listener_t::set_address (const char *addr_) // Create a listening socket. s = open_socket (address.family (), SOCK_STREAM, IPPROTO_TCP); -#ifdef ZMQ_HAVE_WINDOWS - if (s == INVALID_SOCKET) - errno = wsa_error_to_errno (WSAGetLastError ()); -#endif // IPv6 address family not supported, try automatic downgrade to IPv4. - if (address.family () == AF_INET6 + if (s == -1 && address.family () == AF_INET6 && errno == EAFNOSUPPORT && options.ipv6) { - rc = address.resolve (addr_, true, true); + rc = address.resolve (addr_, true, false); if (rc != 0) return rc; - s = ::socket (address.family (), SOCK_STREAM, IPPROTO_TCP); + s = open_socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); } #ifdef ZMQ_HAVE_WINDOWS