summaryrefslogtreecommitdiff
path: root/ACE/ace/SOCK_Dgram_Mcast.cpp
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2012-03-24 22:01:30 +0000
committerSteve Huston <shuston@riverace.com>2012-03-24 22:01:30 +0000
commit4a032cf69632c1ad7bccf27db3a44d1b5cad48f0 (patch)
tree348d85d8de771636c10e4e4d94fea4d793793688 /ACE/ace/SOCK_Dgram_Mcast.cpp
parentf23330c58af5a10749b897449a54050ce1e120b1 (diff)
downloadATCD-4a032cf69632c1ad7bccf27db3a44d1b5cad48f0.tar.gz
ChangeLogTag:Sat Mar 24 21:53:13 UTC 2012 Steve Huston <shuston@riverace.com>
Diffstat (limited to 'ACE/ace/SOCK_Dgram_Mcast.cpp')
-rw-r--r--ACE/ace/SOCK_Dgram_Mcast.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/ACE/ace/SOCK_Dgram_Mcast.cpp b/ACE/ace/SOCK_Dgram_Mcast.cpp
index e1d4737205e..9e968a47663 100644
--- a/ACE/ace/SOCK_Dgram_Mcast.cpp
+++ b/ACE/ace/SOCK_Dgram_Mcast.cpp
@@ -351,13 +351,29 @@ ACE_SOCK_Dgram_Mcast::subscribe_ifs (const ACE_INET_Addr &mcast_addr,
return -1;
}
- while (pAddrs)
+ for (; pAddrs; pAddrs = pAddrs->Next)
{
- if (this->join (mcast_addr, reuse_addr,
- ACE_TEXT_CHAR_TO_TCHAR(pAddrs->AdapterName)) == 0)
- ++nr_subscribed;
+ if (pAddrs->OperStatus != IfOperStatusUp)
+ continue;
- pAddrs = pAddrs->Next;
+ // The ACE_SOCK_Dgram::make_multicast_ifaddr (IPv4), called by join(),
+ // can only deal with a dotted-decimal address, not an interface name.
+ if (family == AF_INET)
+ {
+ ACE_INET_Addr intf_addr ((sockaddr_in*)(pAddrs->FirstUnicastAddress->Address.lpSockaddr),
+ pAddrs->FirstUnicastAddress->Address.iSockaddrLength);
+ char intf_addr_str[INET_ADDRSTRLEN];
+ intf_addr.get_host_addr (intf_addr_str, sizeof (intf_addr_str));
+ if (this->join (mcast_addr, reuse_addr,
+ ACE_TEXT_CHAR_TO_TCHAR(intf_addr_str)) == 0)
+ ++nr_subscribed;
+ }
+ else
+ {
+ if (this->join (mcast_addr, reuse_addr,
+ ACE_TEXT_CHAR_TO_TCHAR(pAddrs->AdapterName)) == 0)
+ ++nr_subscribed;
+ }
}
delete[] buf; // clean up
@@ -389,7 +405,7 @@ ACE_SOCK_Dgram_Mcast::subscribe_ifs (const ACE_INET_Addr &mcast_addr,
--if_cnt;
// Convert to 0-based for indexing, next loop check.
- if (if_addrs[if_cnt].get_type () != AF_INET || if_addrs[if_cnt].is_loopback ())
+ if (if_addrs[if_cnt].get_type () != family || if_addrs[if_cnt].is_loopback ())
continue;
char addr_buf[INET6_ADDRSTRLEN];
if (this->join (mcast_addr,