diff options
| author | Jeff Garzik <[email protected]> | 2014-08-18 16:50:39 -0400 |
|---|---|---|
| committer | Jeff Garzik <[email protected]> | 2014-08-18 16:50:39 -0400 |
| commit | 3a56de7fc318a45a7096cd318e2f2d7f8124ce24 (patch) | |
| tree | 20c10f164c038a4d32f883ddfcecb7206fb55457 /src/addrman.cpp | |
| parent | Merge pull request #4704 (diff) | |
| download | discoin-3a56de7fc318a45a7096cd318e2f2d7f8124ce24.tar.xz discoin-3a56de7fc318a45a7096cd318e2f2d7f8124ce24.zip | |
addrman: Do not propagate obviously poor addresses onto the network
Diffstat (limited to 'src/addrman.cpp')
| -rw-r--r-- | src/addrman.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/addrman.cpp b/src/addrman.cpp index 3628af2ea..704766dbf 100644 --- a/src/addrman.cpp +++ b/src/addrman.cpp @@ -492,17 +492,23 @@ int CAddrMan::Check_() 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) nNodes = ADDRMAN_GETADDR_MAX; - // perform a random shuffle over the first nNodes elements of vRandom (selecting from all) - for (int n = 0; n<nNodes; n++) + // gather a list of random nodes, skipping those of low quality + for (unsigned int n = 0; n < vRandom.size(); n++) { + if (vAddr.size() >= nNodes) + break; + int nRndPos = GetRandInt(vRandom.size() - n) + n; SwapRandom(n, nRndPos); 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); } } |