From 1e87d9252782423885f569a789714966c237b61f Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Thu, 7 Apr 2016 13:15:41 +0100 Subject: [PATCH] Problem: zmq_connect (TCP) has no IPv4 fallback Solution: if opening an IPv6 TCP socket fails because IPv6 is not available, try to open an IPv4 socket instead when creating and connecting a TCP endpoint. --- src/tcp_connecter.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 ());