diff options
author | Steve Huston <shuston@riverace.com> | 2012-03-24 22:01:30 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 2012-03-24 22:01:30 +0000 |
commit | 4a032cf69632c1ad7bccf27db3a44d1b5cad48f0 (patch) | |
tree | 348d85d8de771636c10e4e4d94fea4d793793688 /ACE/ace/SOCK_Dgram_Mcast.cpp | |
parent | f23330c58af5a10749b897449a54050ce1e120b1 (diff) | |
download | ATCD-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.cpp | 28 |
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, |