From c2fa70ddfd7711d514a701b3a7c8adb561acc3ff Mon Sep 17 00:00:00 2001 From: Satoshi Nakamoto Date: Tue, 10 Aug 2010 16:03:01 +0000 Subject: [PATCH] always make 8 outbound connections even if have inbound, limit one outbound connection per a.b.?.? range, switch -maxconnections=# --- main.cpp | 2 +- net.cpp | 28 ++++++++++++++++++++++------ serialize.h | 2 +- ui.cpp | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/main.cpp b/main.cpp index 018c587803..a03b956526 100644 --- a/main.cpp +++ b/main.cpp @@ -885,7 +885,7 @@ void Lockdown(CBlockIndex* pindexNew) printf("Lockdown: current best=%s height=%d work=%s\n", hashBestChain.ToString().substr(0,22).c_str(), nBestHeight, bnBestChainWork.ToString().c_str()); printf("Lockdown: IsLockdown()=%d\n", (IsLockdown() ? 1 : 0)); if (IsLockdown()) - printf("Lockdown: WARNING: Displayed transactions may not be correct! You may need to upgrade.\n"); + printf("Lockdown: WARNING: Displayed transactions may not be correct! You may need to upgrade, or other nodes may need to upgrade.\n"); } diff --git a/net.cpp b/net.cpp index 25f5c24387..8931270ba4 100644 --- a/net.cpp +++ b/net.cpp @@ -4,6 +4,8 @@ #include "headers.h" +static const int MAX_OUTBOUND_CONNECTIONS = 8; + void ThreadMessageHandler2(void* parg); void ThreadSocketHandler2(void* parg); void ThreadOpenConnections2(void* parg); @@ -653,6 +655,10 @@ void ThreadSocketHandler2(void* parg) if (WSAGetLastError() != WSAEWOULDBLOCK) printf("socket error accept failed: %d\n", WSAGetLastError()); } + else if (mapArgs.count("-maxconnections") && (int)vNodes.size() >= atoi(mapArgs["-maxconnections"]) - MAX_OUTBOUND_CONNECTIONS) + { + closesocket(hSocket); + } else { printf("accepted connection %s\n", addr.ToStringLog().c_str()); @@ -879,12 +885,21 @@ void ThreadOpenConnections2(void* parg) int64 nStart = GetTime(); loop { - // Wait + // Limit outbound connections vnThreadsRunning[1]--; Sleep(500); - const int nMaxConnections = 8; - while (vNodes.size() >= nMaxConnections) + loop { + int nOutbound = 0; + CRITICAL_BLOCK(cs_vNodes) + foreach(CNode* pnode, vNodes) + if (!pnode->fInbound) + nOutbound++; + int nMaxOutboundConnections = MAX_OUTBOUND_CONNECTIONS; + if (mapArgs.count("-maxconnections")) + nMaxOutboundConnections = min(nMaxOutboundConnections, atoi(mapArgs["-maxconnections"])); + if (nOutbound < nMaxOutboundConnections) + break; Sleep(2000); if (fShutdown) return; @@ -948,18 +963,19 @@ void ThreadOpenConnections2(void* parg) CAddress addrConnect; int64 nBest = INT64_MIN; - // Do this here so we don't have to critsect vNodes inside mapAddresses critsect + // Only connect to one address per a.b.?.? range. + // Do this here so we don't have to critsect vNodes inside mapAddresses critsect. set setConnected; CRITICAL_BLOCK(cs_vNodes) foreach(CNode* pnode, vNodes) - setConnected.insert(pnode->addr.ip); + setConnected.insert(pnode->addr.ip & 0x0000ffff); CRITICAL_BLOCK(cs_mapAddresses) { foreach(const PAIRTYPE(vector, CAddress)& item, mapAddresses) { const CAddress& addr = item.second; - if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip)) + if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip & 0x0000ffff)) continue; int64 nSinceLastSeen = GetAdjustedTime() - addr.nTime; int64 nSinceLastTry = GetAdjustedTime() - addr.nLastTry; diff --git a/serialize.h b/serialize.h index 521798e3e6..d3c4deabd3 100644 --- a/serialize.h +++ b/serialize.h @@ -20,7 +20,7 @@ class CDataStream; class CAutoFile; static const int VERSION = 308; -static const char* pszSubVer = ".1"; +static const char* pszSubVer = ".2"; diff --git a/ui.cpp b/ui.cpp index e6f022bf6a..f3e809a840 100644 --- a/ui.cpp +++ b/ui.cpp @@ -1015,7 +1015,7 @@ void CMainFrame::OnPaintListCtrl(wxPaintEvent& event) // Update status bar static bool fPrevLockdown; if (IsLockdown()) - m_statusBar->SetStatusText(string(" ") + _("WARNING: Displayed transactions may not be correct! You may need to upgrade."), 0); + m_statusBar->SetStatusText(string(" ") + _("WARNING: Displayed transactions may not be correct! You may need to upgrade, or other nodes may need to upgrade."), 0); else if (fPrevLockdown) m_statusBar->SetStatusText("", 0); fPrevLockdown = IsLockdown();