diff options
author | Steven McCoy <steven.mccoy@miru.hk> | 2011-08-15 08:56:00 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2011-08-15 08:56:00 +0200 |
commit | 57440b86e2c62c78f3904abb17f11500ba0a1a6f (patch) | |
tree | dfcb52dfc43057f5628033e062a42991b4591771 /src/tcp_listener.cpp | |
parent | 3c3c0bfd1f5b987ee42786de25259c46393fe343 (diff) |
Add IPv6 support to tcp_listener
Signed-off-by: Steven McCoy <steven.mccoy@miru.hk>
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
Diffstat (limited to 'src/tcp_listener.cpp')
-rw-r--r-- | src/tcp_listener.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp index ef97862..406b4d0 100644 --- a/src/tcp_listener.cpp +++ b/src/tcp_listener.cpp @@ -131,6 +131,20 @@ int zmq::tcp_listener_t::set_address (const char *addr_) // Create a listening socket. s = ::socket (addr.ss_family, SOCK_STREAM, IPPROTO_TCP); #ifdef ZMQ_HAVE_WINDOWS + if (s == INVALID_SOCKET) + wsa_error_to_errno (); +#endif + + // IPv6 address family not supported, try automatic downgrade to IPv4. + if (addr.ss_family == AF_INET6 && errno == EAFNOSUPPORT && + !options.ipv4only) { + rc = resolve_ip_interface (&addr, &addr_len, addr_, true); + if (rc != 0) + return rc; + s = ::socket (addr.ss_family, SOCK_STREAM, IPPROTO_TCP); + } + +#ifdef ZMQ_HAVE_WINDOWS if (s == INVALID_SOCKET) { wsa_error_to_errno (); return -1; @@ -140,6 +154,11 @@ int zmq::tcp_listener_t::set_address (const char *addr_) return -1; #endif + // On some systems, IPv4 mapping in IPv6 sockets is disabled by default. + // Switch it on in such cases. + if (addr.ss_family == AF_INET6) + enable_ipv4_mapping (s); + // Allow reusing of the address. int flag = 1; #ifdef ZMQ_HAVE_WINDOWS |