addrman: Do not propagate obviously poor addresses onto the network

This commit is contained in:
Jeff Garzik 2014-08-18 16:50:39 -04:00
parent a4f151f714
commit 3a56de7fc3

View File

@ -492,17 +492,23 @@ int CAddrMan::Check_()
void CAddrMan::GetAddr_(std::vector<CAddress> &vAddr) void CAddrMan::GetAddr_(std::vector<CAddress> &vAddr)
{ {
int nNodes = ADDRMAN_GETADDR_MAX_PCT*vRandom.size()/100; unsigned int nNodes = ADDRMAN_GETADDR_MAX_PCT * vRandom.size() / 100;
if (nNodes > ADDRMAN_GETADDR_MAX) if (nNodes > ADDRMAN_GETADDR_MAX)
nNodes = ADDRMAN_GETADDR_MAX; nNodes = ADDRMAN_GETADDR_MAX;
// perform a random shuffle over the first nNodes elements of vRandom (selecting from all) // gather a list of random nodes, skipping those of low quality
for (int n = 0; n<nNodes; n++) for (unsigned int n = 0; n < vRandom.size(); n++)
{ {
if (vAddr.size() >= nNodes)
break;
int nRndPos = GetRandInt(vRandom.size() - n) + n; int nRndPos = GetRandInt(vRandom.size() - n) + n;
SwapRandom(n, nRndPos); SwapRandom(n, nRndPos);
assert(mapInfo.count(vRandom[n]) == 1); assert(mapInfo.count(vRandom[n]) == 1);
vAddr.push_back(mapInfo[vRandom[n]]);
const CAddrInfo& ai = mapInfo[vRandom[n]];
if (!ai.IsTerrible())
vAddr.push_back(ai);
} }
} }