summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Network.cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2008-01-31 13:36:06 -0330
committerDwayne Boone <dwayne@zeroc.com>2008-01-31 13:36:06 -0330
commitf3ddaa5d22046bd0d9dd40a1a84cea2fad4e59ac (patch)
tree4380e74b7c1de6532ddcbfbb10fcf8fadafc9d4a /cpp/src/Ice/Network.cpp
parentbug 2412: python bug with embedded nulls in strings (diff)
downloadice-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.cpp19
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)