diff options
author | Steve Huston <shuston@riverace.com> | 2012-04-03 22:55:46 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 2012-04-03 22:55:46 +0000 |
commit | d54316917be050c725839ef41af379bf91d4a40d (patch) | |
tree | 545842573f225caaaf5954e6d9fede009470a8ef /ACE/ace/SOCK_Dgram_Mcast.cpp | |
parent | be4232a492d8f81dd0d29c68922a743bb290e484 (diff) | |
download | ATCD-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.cpp | 16 |
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; } |