changeset 232:45de6d2d4415 draft

always make 8 outbound connections even if have inbound, limit one outbound connection per a.b.?.? range, switch -maxconnections=#
author Satoshi Nakamoto <satoshin@gmx.com>
date Tue, 10 Aug 2010 16:03:01 +0000
parents e60008d121be
children e6e5741f4aca
files main.cpp net.cpp serialize.h ui.cpp
diffstat 4 files changed, 25 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/main.cpp
+++ b/main.cpp
@@ -885,7 +885,7 @@
     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");
 }
 
 
--- 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 @@
                 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 @@
     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 @@
         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<unsigned int> 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<unsigned char>, 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;
--- a/serialize.h
+++ b/serialize.h
@@ -20,7 +20,7 @@
 class CAutoFile;
 
 static const int VERSION = 308;
-static const char* pszSubVer = ".1";
+static const char* pszSubVer = ".2";
 
 
 
--- a/ui.cpp
+++ b/ui.cpp
@@ -1015,7 +1015,7 @@
     // 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();