|
|
@ -775,12 +775,23 @@ void SocketSendData(CNode *pnode) |
|
|
|
|
|
|
|
|
|
|
|
static list<CNode*> vNodesDisconnected; |
|
|
|
static list<CNode*> vNodesDisconnected; |
|
|
|
|
|
|
|
|
|
|
|
static bool ReverseCompareNodeMinPingTime(CNode *a, CNode *b) |
|
|
|
class CNodeRef { |
|
|
|
|
|
|
|
public: |
|
|
|
|
|
|
|
CNodeRef(CNode *pnode) : _pnode(pnode) {_pnode->AddRef();} |
|
|
|
|
|
|
|
~CNodeRef() {_pnode->Release();} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CNode& operator *() const {return *_pnode;}; |
|
|
|
|
|
|
|
CNode* operator ->() const {return _pnode;}; |
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
CNode *_pnode; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool ReverseCompareNodeMinPingTime(const CNodeRef &a, const CNodeRef &b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return a->nMinPingUsecTime > b->nMinPingUsecTime; |
|
|
|
return a->nMinPingUsecTime > b->nMinPingUsecTime; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool ReverseCompareNodeTimeConnected(CNode *a, CNode *b) |
|
|
|
static bool ReverseCompareNodeTimeConnected(const CNodeRef &a, const CNodeRef &b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return a->nTimeConnected > b->nTimeConnected; |
|
|
|
return a->nTimeConnected > b->nTimeConnected; |
|
|
|
} |
|
|
|
} |
|
|
@ -795,7 +806,7 @@ public: |
|
|
|
GetRandBytes(vchSecretKey.data(), vchSecretKey.size()); |
|
|
|
GetRandBytes(vchSecretKey.data(), vchSecretKey.size()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool operator()(CNode *a, CNode *b) |
|
|
|
bool operator()(const CNodeRef &a, const CNodeRef &b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::vector<unsigned char> vchGroupA, vchGroupB; |
|
|
|
std::vector<unsigned char> vchGroupA, vchGroupB; |
|
|
|
CSHA256 hashA, hashB; |
|
|
|
CSHA256 hashA, hashB; |
|
|
@ -818,7 +829,7 @@ public: |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
static bool AttemptToEvictConnection(bool fPreferNewConnection) { |
|
|
|
static bool AttemptToEvictConnection(bool fPreferNewConnection) { |
|
|
|
std::vector<CNode*> vEvictionCandidates; |
|
|
|
std::vector<CNodeRef> vEvictionCandidates; |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
|
|
|
|
|
|
@ -831,7 +842,7 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
if (node->addr.IsLocal()) |
|
|
|
if (node->addr.IsLocal()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
vEvictionCandidates.push_back(node); |
|
|
|
vEvictionCandidates.push_back(CNodeRef(node)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -859,8 +870,8 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { |
|
|
|
// Identify CNetAddr with the most connections
|
|
|
|
// Identify CNetAddr with the most connections
|
|
|
|
CNetAddr naMostConnections; |
|
|
|
CNetAddr naMostConnections; |
|
|
|
unsigned int nMostConnections = 0; |
|
|
|
unsigned int nMostConnections = 0; |
|
|
|
std::map<CNetAddr, std::vector<CNode*> > mapAddrCounts; |
|
|
|
std::map<CNetAddr, std::vector<CNodeRef> > mapAddrCounts; |
|
|
|
BOOST_FOREACH(CNode *node, vEvictionCandidates) { |
|
|
|
BOOST_FOREACH(const CNodeRef &node, vEvictionCandidates) { |
|
|
|
mapAddrCounts[node->addr].push_back(node); |
|
|
|
mapAddrCounts[node->addr].push_back(node); |
|
|
|
|
|
|
|
|
|
|
|
if (mapAddrCounts[node->addr].size() > nMostConnections) { |
|
|
|
if (mapAddrCounts[node->addr].size() > nMostConnections) { |
|
|
|