Prevent duplicate connections where one is by name and another by ip
This commit is contained in:
parent
1111b80df8
commit
f9f5cfc506
1 changed files with 20 additions and 0 deletions
20
src/net.cpp
20
src/net.cpp
|
@ -400,6 +400,26 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pszDest && addrConnect.IsValid()) {
|
||||||
|
// It is possible that we already have a connection to the IP/port pszDest resolved to.
|
||||||
|
// In that case, drop the connection that was just created, and return the existing CNode instead.
|
||||||
|
// Also store the name we used to connect in that CNode, so that future FindNode() calls to that
|
||||||
|
// name catch this early.
|
||||||
|
CNode* pnode = FindNode((CService)addrConnect);
|
||||||
|
if (pnode)
|
||||||
|
{
|
||||||
|
pnode->AddRef();
|
||||||
|
{
|
||||||
|
LOCK(cs_vNodes);
|
||||||
|
if (pnode->addrName.empty()) {
|
||||||
|
pnode->addrName = std::string(pszDest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseSocket(hSocket);
|
||||||
|
return pnode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
addrman.Attempt(addrConnect, fCountFailure);
|
addrman.Attempt(addrConnect, fCountFailure);
|
||||||
|
|
||||||
// Add node
|
// Add node
|
||||||
|
|
Loading…
Reference in a new issue