summaryrefslogtreecommitdiff
path: root/ACE/ace/SOCK_Dgram_Mcast.cpp
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2012-04-03 22:55:46 +0000
committerSteve Huston <shuston@riverace.com>2012-04-03 22:55:46 +0000
commitd54316917be050c725839ef41af379bf91d4a40d (patch)
tree545842573f225caaaf5954e6d9fede009470a8ef /ACE/ace/SOCK_Dgram_Mcast.cpp
parentbe4232a492d8f81dd0d29c68922a743bb290e484 (diff)
downloadATCD-d54316917be050c725839ef41af379bf91d4a40d.tar.gz
ChangeLogTag:Tue Apr 3 22:49:11 UTC 2012 Steve Huston <shuston@riverace.com>
Diffstat (limited to 'ACE/ace/SOCK_Dgram_Mcast.cpp')
-rw-r--r--ACE/ace/SOCK_Dgram_Mcast.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/ACE/ace/SOCK_Dgram_Mcast.cpp b/ACE/ace/SOCK_Dgram_Mcast.cpp
index 9e968a47663..a5d5e5e0c16 100644
--- a/ACE/ace/SOCK_Dgram_Mcast.cpp
+++ b/ACE/ace/SOCK_Dgram_Mcast.cpp
@@ -327,12 +327,21 @@ ACE_SOCK_Dgram_Mcast::subscribe_ifs (const ACE_INET_Addr &mcast_addr,
// Initial call to determine actual memory size needed
DWORD dwRetVal;
ULONG bufLen = 0;
+ // Note... GetAdaptersAddresses returns different bufLen values depending
+ // on how many multicast joins there are on the system. To avoid this,
+ // specify that we don't want to know about multicast addresses. This
+ // does not avoid multicastable interfaces and makes the size-check
+ // more reliable across varying conditions.
+ DWORD flags = GAA_FLAG_SKIP_MULTICAST;
if ((dwRetVal = ::GetAdaptersAddresses (family,
- 0,
+ flags,
0,
&tmp_addrs,
&bufLen)) != ERROR_BUFFER_OVERFLOW)
- return -1; // With output bufferlength 0 this can't be right.
+ {
+ errno = dwRetVal;
+ return -1; // With output bufferlength 0 this can't be right.
+ }
// Get required output buffer and retrieve info for real.
PIP_ADAPTER_ADDRESSES pAddrs;
@@ -342,12 +351,13 @@ ACE_SOCK_Dgram_Mcast::subscribe_ifs (const ACE_INET_Addr &mcast_addr,
-1);
pAddrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES> (buf);
if ((dwRetVal = ::GetAdaptersAddresses (family,
- 0,
+ flags,
0,
pAddrs,
&bufLen)) != NO_ERROR)
{
delete[] buf; // clean up
+ errno = dwRetVal;
return -1;
}