summaryrefslogtreecommitdiff
path: root/src/tcp_listener.cpp
diff options
context:
space:
mode:
authorSteven McCoy <steven.mccoy@miru.hk>2011-08-15 08:56:00 +0200
committerMartin Sustrik <sustrik@250bpm.com>2011-08-15 08:56:00 +0200
commit57440b86e2c62c78f3904abb17f11500ba0a1a6f (patch)
treedfcb52dfc43057f5628033e062a42991b4591771 /src/tcp_listener.cpp
parent3c3c0bfd1f5b987ee42786de25259c46393fe343 (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.cpp19
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