Merge branch 'keepnode' of https://github.com/TheBlueMatt/bitcoin
This commit is contained in:
commit
8498c59144
4 changed files with 100 additions and 24 deletions
|
@ -192,7 +192,7 @@ bool AppInit2(int argc, char* argv[])
|
||||||
" -dns \t " + _("Allow DNS lookups for addnode and connect") + "\n" +
|
" -dns \t " + _("Allow DNS lookups for addnode and connect") + "\n" +
|
||||||
" -port=<port> \t\t " + _("Listen for connections on <port> (default: 8333 or testnet: 18333)") + "\n" +
|
" -port=<port> \t\t " + _("Listen for connections on <port> (default: 8333 or testnet: 18333)") + "\n" +
|
||||||
" -maxconnections=<n>\t " + _("Maintain at most <n> connections to peers (default: 125)") + "\n" +
|
" -maxconnections=<n>\t " + _("Maintain at most <n> connections to peers (default: 125)") + "\n" +
|
||||||
" -addnode=<ip> \t " + _("Add a node to connect to") + "\n" +
|
" -addnode=<ip> \t " + _("Add a node to connect to and attempt to keep the connection open") + "\n" +
|
||||||
" -connect=<ip> \t\t " + _("Connect only to the specified node") + "\n" +
|
" -connect=<ip> \t\t " + _("Connect only to the specified node") + "\n" +
|
||||||
" -noirc \t " + _("Don't find peers using internet relay chat") + "\n" +
|
" -noirc \t " + _("Don't find peers using internet relay chat") + "\n" +
|
||||||
" -nolisten \t " + _("Don't accept connections from outside") + "\n" +
|
" -nolisten \t " + _("Don't accept connections from outside") + "\n" +
|
||||||
|
|
101
src/net.cpp
101
src/net.cpp
|
@ -29,6 +29,7 @@ static const int MAX_OUTBOUND_CONNECTIONS = 8;
|
||||||
void ThreadMessageHandler2(void* parg);
|
void ThreadMessageHandler2(void* parg);
|
||||||
void ThreadSocketHandler2(void* parg);
|
void ThreadSocketHandler2(void* parg);
|
||||||
void ThreadOpenConnections2(void* parg);
|
void ThreadOpenConnections2(void* parg);
|
||||||
|
void ThreadOpenAddedConnections2(void* parg);
|
||||||
#ifdef USE_UPNP
|
#ifdef USE_UPNP
|
||||||
void ThreadMapPort2(void* parg);
|
void ThreadMapPort2(void* parg);
|
||||||
#endif
|
#endif
|
||||||
|
@ -61,6 +62,9 @@ CCriticalSection cs_mapRelay;
|
||||||
map<CInv, int64> mapAlreadyAskedFor;
|
map<CInv, int64> mapAlreadyAskedFor;
|
||||||
|
|
||||||
|
|
||||||
|
set<CNetAddr> setservAddNodeAddresses;
|
||||||
|
CCriticalSection cs_setservAddNodeAddresses;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -750,6 +754,8 @@ void ThreadSocketHandler2(void* parg)
|
||||||
}
|
}
|
||||||
else if (nInbound >= GetArg("-maxconnections", 125) - MAX_OUTBOUND_CONNECTIONS)
|
else if (nInbound >= GetArg("-maxconnections", 125) - MAX_OUTBOUND_CONNECTIONS)
|
||||||
{
|
{
|
||||||
|
CRITICAL_BLOCK(cs_setservAddNodeAddresses)
|
||||||
|
if (!setservAddNodeAddresses.count(addr))
|
||||||
closesocket(hSocket);
|
closesocket(hSocket);
|
||||||
}
|
}
|
||||||
else if (CNode::IsBanned(addr))
|
else if (CNode::IsBanned(addr))
|
||||||
|
@ -1211,22 +1217,6 @@ void ThreadOpenConnections2(void* parg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect to manually added nodes first
|
|
||||||
if (mapArgs.count("-addnode"))
|
|
||||||
{
|
|
||||||
BOOST_FOREACH(string strAddr, mapMultiArgs["-addnode"])
|
|
||||||
{
|
|
||||||
CAddress addr(strAddr, fAllowDNS);
|
|
||||||
if (addr.IsValid())
|
|
||||||
{
|
|
||||||
OpenNetworkConnection(addr);
|
|
||||||
Sleep(500);
|
|
||||||
if (fShutdown)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initiate network connections
|
// Initiate network connections
|
||||||
int64 nStart = GetTime();
|
int64 nStart = GetTime();
|
||||||
loop
|
loop
|
||||||
|
@ -1355,6 +1345,76 @@ void ThreadOpenConnections2(void* parg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThreadOpenAddedConnections(void* parg)
|
||||||
|
{
|
||||||
|
IMPLEMENT_RANDOMIZE_STACK(ThreadOpenAddedConnections(parg));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
vnThreadsRunning[7]++;
|
||||||
|
ThreadOpenAddedConnections2(parg);
|
||||||
|
vnThreadsRunning[7]--;
|
||||||
|
}
|
||||||
|
catch (std::exception& e) {
|
||||||
|
vnThreadsRunning[7]--;
|
||||||
|
PrintException(&e, "ThreadOpenAddedConnections()");
|
||||||
|
} catch (...) {
|
||||||
|
vnThreadsRunning[7]--;
|
||||||
|
PrintException(NULL, "ThreadOpenAddedConnections()");
|
||||||
|
}
|
||||||
|
printf("ThreadOpenAddedConnections exiting\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThreadOpenAddedConnections2(void* parg)
|
||||||
|
{
|
||||||
|
printf("ThreadOpenAddedConnections started\n");
|
||||||
|
|
||||||
|
if (mapArgs.count("-addnode") == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
vector<vector<CService> > vservAddressesToAdd(0);
|
||||||
|
BOOST_FOREACH(string& strAddNode, mapMultiArgs["-addnode"])
|
||||||
|
{
|
||||||
|
vector<CService> vservNode(0);
|
||||||
|
if(Lookup(strAddNode.c_str(), vservNode, GetDefaultPort(), fAllowDNS, 0))
|
||||||
|
{
|
||||||
|
vservAddressesToAdd.push_back(vservNode);
|
||||||
|
CRITICAL_BLOCK(cs_setservAddNodeAddresses)
|
||||||
|
BOOST_FOREACH(CService& serv, vservNode)
|
||||||
|
setservAddNodeAddresses.insert(serv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
vector<vector<CService> > vservConnectAddresses = vservAddressesToAdd;
|
||||||
|
// Attempt to connect to each IP for each addnode entry until at least one is successful per addnode entry
|
||||||
|
// (keeping in mind that addnode entries can have many IPs if fAllowDNS)
|
||||||
|
CRITICAL_BLOCK(cs_vNodes)
|
||||||
|
BOOST_FOREACH(CNode* pnode, vNodes)
|
||||||
|
for (vector<vector<CService> >::iterator it = vservConnectAddresses.begin(); it != vservConnectAddresses.end(); it++)
|
||||||
|
BOOST_FOREACH(CService& addrNode, *(it))
|
||||||
|
if (pnode->addr == addrNode)
|
||||||
|
{
|
||||||
|
it = vservConnectAddresses.erase(it);
|
||||||
|
it--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
BOOST_FOREACH(vector<CService>& vserv, vservConnectAddresses)
|
||||||
|
{
|
||||||
|
OpenNetworkConnection(CAddress(*(vserv.begin())));
|
||||||
|
Sleep(500);
|
||||||
|
if (fShutdown)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (fShutdown)
|
||||||
|
return;
|
||||||
|
vnThreadsRunning[7]--;
|
||||||
|
Sleep(120000); // Retry every 2 minutes
|
||||||
|
vnThreadsRunning[7]++;
|
||||||
|
if (fShutdown)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool OpenNetworkConnection(const CAddress& addrConnect)
|
bool OpenNetworkConnection(const CAddress& addrConnect)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
@ -1631,6 +1691,10 @@ void StartNode(void* parg)
|
||||||
if (!CreateThread(ThreadSocketHandler, NULL))
|
if (!CreateThread(ThreadSocketHandler, NULL))
|
||||||
printf("Error: CreateThread(ThreadSocketHandler) failed\n");
|
printf("Error: CreateThread(ThreadSocketHandler) failed\n");
|
||||||
|
|
||||||
|
// Initiate outbound connections from -addnode
|
||||||
|
if (!CreateThread(ThreadOpenAddedConnections, NULL))
|
||||||
|
printf("Error: CreateThread(ThreadOpenAddedConnections) failed\n");
|
||||||
|
|
||||||
// Initiate outbound connections
|
// Initiate outbound connections
|
||||||
if (!CreateThread(ThreadOpenConnections, NULL))
|
if (!CreateThread(ThreadOpenConnections, NULL))
|
||||||
printf("Error: CreateThread(ThreadOpenConnections) failed\n");
|
printf("Error: CreateThread(ThreadOpenConnections) failed\n");
|
||||||
|
@ -1650,9 +1714,7 @@ bool StopNode()
|
||||||
nTransactionsUpdated++;
|
nTransactionsUpdated++;
|
||||||
int64 nStart = GetTime();
|
int64 nStart = GetTime();
|
||||||
while (vnThreadsRunning[0] > 0 || vnThreadsRunning[2] > 0 || vnThreadsRunning[3] > 0 || vnThreadsRunning[4] > 0
|
while (vnThreadsRunning[0] > 0 || vnThreadsRunning[2] > 0 || vnThreadsRunning[3] > 0 || vnThreadsRunning[4] > 0
|
||||||
#ifdef USE_UPNP
|
|| (fHaveUPnP && vnThreadsRunning[5] > 0) || vnThreadsRunning[6] > 0 || vnThreadsRunning[7] > 0
|
||||||
|| vnThreadsRunning[5] > 0
|
|
||||||
#endif
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (GetTime() - nStart > 20)
|
if (GetTime() - nStart > 20)
|
||||||
|
@ -1666,6 +1728,7 @@ bool StopNode()
|
||||||
if (vnThreadsRunning[4] > 0) printf("ThreadRPCServer still running\n");
|
if (vnThreadsRunning[4] > 0) printf("ThreadRPCServer still running\n");
|
||||||
if (fHaveUPnP && vnThreadsRunning[5] > 0) printf("ThreadMapPort still running\n");
|
if (fHaveUPnP && vnThreadsRunning[5] > 0) printf("ThreadMapPort still running\n");
|
||||||
if (vnThreadsRunning[6] > 0) printf("ThreadDNSAddressSeed still running\n");
|
if (vnThreadsRunning[6] > 0) printf("ThreadDNSAddressSeed still running\n");
|
||||||
|
if (vnThreadsRunning[7] > 0) printf("ThreadOpenAddedConnections still running\n");
|
||||||
while (vnThreadsRunning[2] > 0 || vnThreadsRunning[4] > 0)
|
while (vnThreadsRunning[2] > 0 || vnThreadsRunning[4] > 0)
|
||||||
Sleep(20);
|
Sleep(20);
|
||||||
Sleep(50);
|
Sleep(50);
|
||||||
|
|
|
@ -98,7 +98,7 @@ bool LookupHostNumeric(const char *pszName, std::vector<CNetAddr>& vIP, int nMax
|
||||||
return LookupHost(pszName, vIP, nMaxSolutions, false);
|
return LookupHost(pszName, vIP, nMaxSolutions, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Lookup(const char *pszName, CService& addr, int portDefault, bool fAllowLookup)
|
bool Lookup(const char *pszName, std::vector<CService>& vAddr, int portDefault, bool fAllowLookup, int nMaxSolutions)
|
||||||
{
|
{
|
||||||
if (pszName[0] == 0)
|
if (pszName[0] == 0)
|
||||||
return false;
|
return false;
|
||||||
|
@ -132,10 +132,22 @@ bool Lookup(const char *pszName, CService& addr, int portDefault, bool fAllowLoo
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CNetAddr> vIP;
|
std::vector<CNetAddr> vIP;
|
||||||
bool fRet = LookupIntern(pszHost, vIP, 1, fAllowLookup);
|
bool fRet = LookupIntern(pszHost, vIP, nMaxSolutions, fAllowLookup);
|
||||||
if (!fRet)
|
if (!fRet)
|
||||||
return false;
|
return false;
|
||||||
addr = CService(vIP[0], port);
|
vAddr.resize(vIP.size());
|
||||||
|
for (int i = 0; i < vIP.size(); i++)
|
||||||
|
vAddr[i] = CService(vIP[i], port);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Lookup(const char *pszName, CService& addr, int portDefault, bool fAllowLookup)
|
||||||
|
{
|
||||||
|
std::vector<CService> vService;
|
||||||
|
bool fRet = Lookup(pszName, vService, portDefault, fAllowLookup, 1);
|
||||||
|
if (!fRet)
|
||||||
|
return false;
|
||||||
|
addr = vService[0];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,6 +128,7 @@ class CService : public CNetAddr
|
||||||
bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, int nMaxSolutions = 0, bool fAllowLookup = true);
|
bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, int nMaxSolutions = 0, bool fAllowLookup = true);
|
||||||
bool LookupHostNumeric(const char *pszName, std::vector<CNetAddr>& vIP, int nMaxSolutions = 0);
|
bool LookupHostNumeric(const char *pszName, std::vector<CNetAddr>& vIP, int nMaxSolutions = 0);
|
||||||
bool Lookup(const char *pszName, CService& addr, int portDefault = 0, bool fAllowLookup = true);
|
bool Lookup(const char *pszName, CService& addr, int portDefault = 0, bool fAllowLookup = true);
|
||||||
|
bool Lookup(const char *pszName, std::vector<CService>& vAddr, int portDefault = 0, bool fAllowLookup = true, int nMaxSolutions = 0);
|
||||||
bool LookupNumeric(const char *pszName, CService& addr, int portDefault = 0);
|
bool LookupNumeric(const char *pszName, CService& addr, int portDefault = 0);
|
||||||
bool ConnectSocket(const CService &addr, SOCKET& hSocketRet, int nTimeout = nConnectTimeout);
|
bool ConnectSocket(const CService &addr, SOCKET& hSocketRet, int nTimeout = nConnectTimeout);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue