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/src/Ice/Network.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/src/Ice/Network.cpp')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 19 |
1 files changed, 15 insertions, 4 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) |