diff options
author | Pieter Wuille <pieter.wuille@gmail.com> | 2012-04-24 02:15:00 +0200 |
---|---|---|
committer | Pieter Wuille <pieter.wuille@gmail.com> | 2012-05-04 16:11:54 +0200 |
commit | 478b01d9a797f3ea41cca141992b161867a5996d (patch) | |
tree | 7f560844e88896a190718e3b953a8cfbd4a0b02c /src/net.cpp | |
parent | 9bab521df895c149579b9e64931405c56b008afb (diff) |
Add -seednode connections, and use this for -dnsseed + -proxydns
Diffstat (limited to 'src/net.cpp')
-rw-r--r-- | src/net.cpp | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/src/net.cpp b/src/net.cpp index ca137b70fa..0483206969 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -35,7 +35,7 @@ void ThreadOpenAddedConnections2(void* parg); void ThreadMapPort2(void* parg); #endif void ThreadDNSAddressSeed2(void* parg); -bool OpenNetworkConnection(const CAddress& addrConnect, const char *strDest = NULL); +bool OpenNetworkConnection(const CAddress& addrConnect, const char *strDest = NULL, bool fOneShot = false); @@ -59,6 +59,8 @@ deque<pair<int64, CInv> > vRelayExpiration; CCriticalSection cs_mapRelay; map<CInv, int64> mapAlreadyAskedFor; +static deque<string> vOneShots; +CCriticalSection cs_vOneShots; set<CNetAddr> setservAddNodeAddresses; CCriticalSection cs_setservAddNodeAddresses; @@ -68,6 +70,12 @@ static int nOutbound = 0; static CConditionVariable condOutbound; +void AddOneShot(string strDest) +{ + LOCK(cs_vOneShots); + vOneShots.push_back(strDest); +} + unsigned short GetListenPort() { return (unsigned short)(GetArg("-port", GetDefaultPort())); @@ -328,7 +336,7 @@ CNode* FindNode(const CService& addr) CNode* ConnectNode(CAddress addrConnect, const char *pszDest, int64 nTimeout) { - if (pszDest != NULL) { + if (pszDest == NULL) { if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost) return NULL; @@ -1038,8 +1046,7 @@ void ThreadDNSAddressSeed2(void* parg) for (unsigned int seed_idx = 0; seed_idx < ARRAYLEN(strDNSSeed); seed_idx++) { if (fProxyNameLookup) { - CAddress addr; - OpenNetworkConnection(addr, strDNSSeed[seed_idx][1]); + AddOneShot(strDNSSeed[seed_idx][1]); } else { vector<CNetAddr> vaddr; vector<CAddress> vAdd; @@ -1205,6 +1212,21 @@ void ThreadOpenConnections(void* parg) printf("ThreadOpenConnections exiting\n"); } +void static ProcessOneShot() +{ + string strDest; + { + LOCK(cs_vOneShots); + if (vOneShots.empty()) + return; + strDest = vOneShots.front(); + vOneShots.pop_front(); + } + CAddress addr; + if (!OpenNetworkConnection(addr, strDest.c_str(), true)) + AddOneShot(strDest); +} + void ThreadOpenConnections2(void* parg) { printf("ThreadOpenConnections started\n"); @@ -1214,9 +1236,10 @@ void ThreadOpenConnections2(void* parg) { for (int64 nLoop = 0;; nLoop++) { + ProcessOneShot(); BOOST_FOREACH(string strAddr, mapMultiArgs["-connect"]) { - CAddress addr(CService("0.0.0.0:0")); + CAddress addr; OpenNetworkConnection(addr, strAddr.c_str()); for (int i = 0; i < 10 && i < nLoop; i++) { @@ -1232,6 +1255,8 @@ void ThreadOpenConnections2(void* parg) int64 nStart = GetTime(); loop { + ProcessOneShot(); + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; Sleep(500); vnThreadsRunning[THREAD_OPENCONNECTIONS]++; @@ -1403,7 +1428,7 @@ void ThreadOpenAddedConnections2(void* parg) } } -bool OpenNetworkConnection(const CAddress& addrConnect, const char *strDest) +bool OpenNetworkConnection(const CAddress& addrConnect, const char *strDest, bool fOneShot) { // // Initiate outbound network connection @@ -1426,6 +1451,8 @@ bool OpenNetworkConnection(const CAddress& addrConnect, const char *strDest) if (!pnode) return false; pnode->fNetworkNode = true; + if (fOneShot) + pnode->fOneShot = true; return true; } |