示例#1
0
        private bool AddressManagerContains(AddressManager addressManager, IPEndPoint ipEndPoint)
        {
            foreach (NetworkAddress networkAddress in addressManager.GetAddr())
            {
                if (networkAddress.Endpoint.ToString() == ipEndPoint.ToString())
                {
                    return(true);
                }
            }

            return(false);
        }
示例#2
0
        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();
            }
        }