private bool AddressManagerContains(AddressManager addressManager, IPEndPoint ipEndPoint) { foreach (NetworkAddress networkAddress in addressManager.GetAddr()) { if (networkAddress.Endpoint.ToString() == ipEndPoint.ToString()) { return(true); } } return(false); }
public void CanStressAddrManager() { Exception exception = null; var addrmanager = new AddressManager(); Random randl = new Random(); for (int i = 0; i < 30; i++) { NetworkAddress address = RandomNetworkAddress(randl); IPAddress addressSource = RandomAddress(randl); address.Ago = TimeSpan.FromMinutes(5.0); addrmanager.Add(address, addressSource); } addrmanager.DebugMode = true; var threads = Enumerable .Range(0, 20) .Select(t => new Thread(() => { try { Random rand = new Random(t); for (int i = 0; i < 50; i++) { NetworkAddress address = RandomNetworkAddress(rand); IPAddress addressSource = RandomAddress(rand); var operation = rand.Next(0, 7); switch (operation) { case 0: addrmanager.Attempt(address); break; case 1: addrmanager.Add(address, addressSource); break; case 2: addrmanager.Select(); break; case 3: addrmanager.GetAddr(); break; case 4: { var several = addrmanager.GetAddr(); addrmanager.Good(several.Length == 0 ? address : several[0]); } break; case 5: addrmanager.Connected(address); break; case 6: addrmanager.ToBytes(); break; default: throw new NotSupportedException(); } } } catch (Exception ex) { exception = ex; throw; } })).ToArray(); foreach (var t in threads) { t.Start(); } foreach (var t in threads) { t.Join(); } Assert.True(addrmanager.nNew != 0); Assert.True(addrmanager.nTried != 0); Assert.True(addrmanager.GetAddr().Length != 0); Assert.Null(exception); }
static void Main(string[] args) { var connectionParameters = new NodeConnectionParameters() { ReceiveBufferSize = 1048576, SendBufferSize = 1048576 }; var addressManagerFilePath = "AddressManager.dat"; AddressManager addressManager; try { addressManager = AddressManager.LoadPeerFile(addressManagerFilePath); Console.WriteLine($"Loaded {nameof(AddressManager)} from `{addressManagerFilePath}`."); } catch (FileNotFoundException) { Console.WriteLine($"{nameof(AddressManager)} did not exist at `{addressManagerFilePath}`. Initializing new one."); addressManager = new AddressManager(); } connectionParameters.TemplateBehaviors.Add(new AddressManagerBehavior(addressManager)); var nodes = new NodesGroup(Network.Main, connectionParameters, new NodeRequirement { RequiredServices = NodeServices.Network, MinVersion = ProtocolVersion.WITNESS_VERSION }); Console.WriteLine("Start connecting to nodes..."); nodes.Connect(); Console.WriteLine(); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.AddressFrom)}: {connectionParameters.AddressFrom}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.IsRelay)}: {connectionParameters.IsRelay}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.PreferredTransactionOptions)}: {connectionParameters.PreferredTransactionOptions}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.ReceiveBufferSize)}: {connectionParameters.ReceiveBufferSize}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.ReuseBuffer)}: {connectionParameters.ReuseBuffer}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.SendBufferSize)}: {connectionParameters.SendBufferSize}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.Services)}: {connectionParameters.Services}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.TemplateBehaviors)}.Count(): {connectionParameters.TemplateBehaviors.Count()}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.UserAgent)}: {connectionParameters.UserAgent}"); Console.WriteLine($"{nameof(connectionParameters)}.{nameof(connectionParameters.Version)}: {connectionParameters.Version}"); Console.WriteLine(); Console.WriteLine($"{nameof(addressManager)}.{nameof(addressManager.Count)}: {addressManager.Count}"); Console.WriteLine($"{nameof(addressManager)}.GetAddr().Count(): {addressManager.GetAddr().Count()}"); Console.WriteLine($"{nameof(addressManager)}.GetSerializedSize(): {addressManager.GetSerializedSize()}"); Console.WriteLine(); Console.WriteLine($"{nameof(nodes)}.{nameof(nodes.AllowSameGroup)}: {nodes.AllowSameGroup}"); Console.WriteLine($"{nameof(nodes)}.{nameof(nodes.ConnectedNodes)}.{nameof(nodes.ConnectedNodes.Count)}: {nodes.ConnectedNodes.Count}"); Console.WriteLine($"{nameof(nodes)}.{nameof(nodes.MaximumNodeConnection)}: {nodes.MaximumNodeConnection}"); Console.WriteLine($"{nameof(nodes)}.{nameof(nodes.Requirements)}.{nameof(nodes.Requirements.MinVersion)}: {nodes.Requirements.MinVersion}"); Console.WriteLine($"{nameof(nodes)}.{nameof(nodes.Requirements)}.{nameof(nodes.Requirements.RequiredServices)}: {nodes.Requirements.RequiredServices}"); Console.WriteLine($"{nameof(nodes)}.{nameof(nodes.Requirements)}.{nameof(nodes.Requirements.SupportSPV)}: {nodes.Requirements.SupportSPV}"); Console.WriteLine(); try { int i = 0; while (i < 42) // 7 minutes { Console.WriteLine($"Witing for a connection for {i / (double)6} minutes...."); if (nodes.ConnectedNodes.Count >= 1) { Console.WriteLine("SUCCESSFULLY FOUND A CONNECTION"); return; } Task.Delay(TimeSpan.FromSeconds(10)).GetAwaiter().GetResult(); i++; } throw new TimeoutException($"DID NOT FIND A CONNECTION within {i / (double)6} minutes."); } finally { Console.WriteLine($"Saving {nameof(AddressManager)} to `{addressManagerFilePath}`."); addressManager.SavePeerFile(addressManagerFilePath, Network.Main); nodes.Dispose(); } }