diff options
| author | Andrew Stitcher <astitcher@apache.org> | 2011-08-12 22:32:05 +0000 |
|---|---|---|
| committer | Andrew Stitcher <astitcher@apache.org> | 2011-08-12 22:32:05 +0000 |
| commit | 5e4e74053e0451f5a103820e99eac00992061b4c (patch) | |
| tree | 17e31c3aa347ecc0cf59001f3c82120481f5f6bd /cpp/src/qpid/sys/windows/Socket.cpp | |
| parent | 6035aef61fe726180a918a57a93d66833eaca96a (diff) | |
| download | qpid-python-5e4e74053e0451f5a103820e99eac00992061b4c.tar.gz | |
QPID-3405: IPv6 support for Unix C++ ports:
- On the Listen side we create separate listening sockets for IPv4 and IPv6
making sure to not allow the IPv6 socket to run dual stack. This makes the
reported IPv4 addresses look "normal" and would allow us to turn control
IPv4/IPv6 listening separately.
- On the connect side we make sure to try all the addresses returned by
getaddrinfo() in order until we either find one that connects or have
tried all of them.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1157272 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/windows/Socket.cpp')
| -rw-r--r--[-rwxr-xr-x] | cpp/src/qpid/sys/windows/Socket.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/cpp/src/qpid/sys/windows/Socket.cpp b/cpp/src/qpid/sys/windows/Socket.cpp index baa80f04e0..1ba3831b9f 100755..100644 --- a/cpp/src/qpid/sys/windows/Socket.cpp +++ b/cpp/src/qpid/sys/windows/Socket.cpp @@ -211,21 +211,24 @@ int Socket::read(void *buf, size_t count) const return received; } -int Socket::listen(const std::string&, const std::string& port, int backlog) const +int Socket::listen(const std::string& host, const std::string& port, int backlog) const +{ + SocketAddress sa(host, port); + return listen(sa, backlog); +} + +int Socket::listen(const SocketAddress& addr, int backlog) const { const SOCKET& socket = impl->fd; BOOL yes=1; QPID_WINSOCK_CHECK(setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes))); - struct sockaddr_in name; - memset(&name, 0, sizeof(name)); - name.sin_family = AF_INET; - name.sin_port = htons(boost::lexical_cast<uint16_t>(port)); - name.sin_addr.s_addr = 0; - if (::bind(socket, (struct sockaddr*)&name, sizeof(name)) == SOCKET_ERROR) - throw Exception(QPID_MSG("Can't bind to port " << port << ": " << strError(WSAGetLastError()))); + + if (::bind(socket, getAddrInfo(addr).ai_addr, getAddrInfo(addr).ai_addrlen) == SOCKET_ERROR) + throw Exception(QPID_MSG("Can't bind to " << addr.asString() << ": " << strError(WSAGetLastError()))); if (::listen(socket, backlog) == SOCKET_ERROR) - throw Exception(QPID_MSG("Can't listen on port " << port << ": " << strError(WSAGetLastError()))); + throw Exception(QPID_MSG("Can't listen on " <<addr.asString() << ": " << strError(WSAGetLastError()))); + struct sockaddr_in name; socklen_t namelen = sizeof(name); QPID_WINSOCK_CHECK(::getsockname(socket, (struct sockaddr*)&name, &namelen)); return ntohs(name.sin_port); |
