diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2008-01-31 13:36:06 -0330 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2008-01-31 13:36:06 -0330 |
commit | f3ddaa5d22046bd0d9dd40a1a84cea2fad4e59ac (patch) | |
tree | 4380e74b7c1de6532ddcbfbb10fcf8fadafc9d4a /cpp | |
parent | bug 2412: python bug with embedded nulls in strings (diff) | |
download | ice-f3ddaa5d22046bd0d9dd40a1a84cea2fad4e59ac.tar.bz2 ice-f3ddaa5d22046bd0d9dd40a1a84cea2fad4e59ac.tar.xz ice-f3ddaa5d22046bd0d9dd40a1a84cea2fad4e59ac.zip |
Fixed bug in IPv4 udp multicast
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 19 | ||||
-rw-r--r-- | cpp/src/Ice/Network.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.cpp | 2 |
3 files changed, 16 insertions, 6 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index 8c6aaa05291..749b5683e27 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -822,16 +822,27 @@ IceInternal::setMcastGroup(SOCKET fd, const struct sockaddr_storage& group, cons { struct ip_mreq mreq; mreq.imr_multiaddr = reinterpret_cast<const struct sockaddr_in*>(&group)->sin_addr; - struct sockaddr_storage addr; - getAddress(interface, 0, addr, EnableIPv4); - mreq.imr_interface = reinterpret_cast<const struct sockaddr_in*>(&addr)->sin_addr; + mreq.imr_interface.s_addr = INADDR_ANY; + if(interface.size() > 0) + { + struct sockaddr_storage addr; + getAddressForServer(interface, 0, addr, EnableIPv4); + mreq.imr_interface = reinterpret_cast<const struct sockaddr_in*>(&addr)->sin_addr; + } rc = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, int(sizeof(mreq))); } else { struct ipv6_mreq mreq; mreq.ipv6mr_multiaddr = reinterpret_cast<const struct sockaddr_in6*>(&group)->sin6_addr; - mreq.ipv6mr_interface = atoi(interface.c_str()); + istringstream p(interface); + if(!(p >> mreq.ipv6mr_interface) || !p.eof()) + { + closeSocketNoThrow(fd); + SocketException ex(__FILE__, __LINE__); + ex.error = 0; + throw ex; + } rc = setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char*)&mreq, int(sizeof(mreq))); } if(rc == SOCKET_ERROR) diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h index bf24a7c7fd7..c58c578d1d5 100644 --- a/cpp/src/Ice/Network.h +++ b/cpp/src/Ice/Network.h @@ -106,7 +106,6 @@ ICE_API void getAddressForServer(const std::string&, int, struct sockaddr_storag ICE_API void getAddress(const std::string&, int, struct sockaddr_storage&, ProtocolSupport); ICE_API std::vector<struct sockaddr_storage> getAddresses(const std::string&, int, ProtocolSupport, bool); - ICE_API int compareAddress(const struct sockaddr_storage&, const struct sockaddr_storage&); ICE_API void createPipe(SOCKET fds[2]); diff --git a/cpp/src/Ice/UdpTransceiver.cpp b/cpp/src/Ice/UdpTransceiver.cpp index 10e863ad359..4d2b904c185 100644 --- a/cpp/src/Ice/UdpTransceiver.cpp +++ b/cpp/src/Ice/UdpTransceiver.cpp @@ -512,11 +512,11 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s { setReuseAddress(_fd, true); +#ifdef _WIN32 // // Windows does not allow binding to the mcast address itself // so we bind to INADDR_ANY (0.0.0.0) instead. // -#ifdef _WIN32 struct sockaddr_storage addr; getAddressForServer("", port, addr, instance->protocolSupport()); doBind(_fd, addr); |