Exemplo n.º 1
0
        public Client(Bytes <Address> address, IPEndPoint endPoint, string baseDirectory, string?networkPrefix = null, IEnumerable <IPEndPoint>?seeds = null, SuperNodeConfig?superConfig = null, string?name = null)
        {
            Name          = name ?? endPoint.ToString();
            Address       = address;
            NetworkPrefix = networkPrefix;
            SuperConfig   = superConfig;
            EndPoint      = endPoint;
            BindEndPoint  = new IPEndPoint(IPAddress.Any, endPoint.Port);
            string chainName = networkPrefix ?? "main";

            System = new BlockChainSystem(this, Path.Combine(baseDirectory, $"{address}-{chainName}"), chainName);
            P2P    = new P2P(this);
            if (superConfig is not null)
            {
                ProducerSystem = new ProducerSystem(this);
            }
            Nodes = new KBucket(16, address, P2P.Ping);

            P2P.Init();

            Random random = new Random();

            refreshKBucketTimeSpan = TimeSpan.FromSeconds(random.NextDouble() * 5 + 60);
            refreshKBucketTimer    = new Timer(async delegate {
                if (closeCancelTokenSource.IsCancellationRequested)
                {
                    return;
                }
                var randomAddress = Bytes <Address> .Random();
                var neighborNodes = Nodes.FindNode(randomAddress, 10);
                var tasks         = Array.ConvertAll(neighborNodes, node => P2P.FindNode(randomAddress, Nodes.K, node.IPEndPoint, hasRemoteNode: false, refreshKBucket: true));

                var now = DateTime.UtcNow;
                lock (broadcastIdRecord) {
                    var removeKeys = new List <Bytes <Hash160> >();
                    foreach (var(id, time) in broadcastIdRecord)
                    {
                        if (now - time >= broadcastTimeout)
                        {
                            removeKeys.Add(id);
                        }
                        else
                        {
                            break;
                        }
                    }
                    foreach (var id in removeKeys)
                    {
                        broadcastIdRecord.Remove(id);
                    }
                }

                await tasks.WhenAll();
            }, null, refreshKBucketTimeSpan, refreshKBucketTimeSpan);
Exemplo n.º 2
0
        public Client(Address address, IPAddress bindIPAddress, int udpPort, int tcpPort, string?networkPrefix = null, IEnumerable <IPEndPoint>?seeds = null)
        {
            Address       = address;
            NetworkPrefix = networkPrefix;
            System        = new BlockChainSystem(this, networkPrefix ?? "main");

            udpServer = new UdpServer(this, new IPEndPoint(bindIPAddress, udpPort));
            tcpServer = new TcpServer(this, new IPEndPoint(bindIPAddress, tcpPort));
            Nodes     = new KBucket(16, address, Ping);

            refreshKBucketTimeSpan = TimeSpan.FromSeconds(random.NextDouble() * 1 + 7);
            refreshKBucketTimer    = new Timer(async delegate {
                if (closeCancelTokenSource.IsCancellationRequested)
                {
                    return;
                }
                var randomAddress = Address.Random();
                var neighborNodes = Nodes.FindNode(randomAddress, 10);
                var tasks         = Array.ConvertAll(neighborNodes, node => FindNode(randomAddress, Nodes.K, node.IPEndPoint, hasRemoteNode: false, refreshKBucket: true));

                var now = DateTime.Now;
                lock (broadcastIdRecord) {
                    var removeKeys = new List <Address>();
                    foreach (var(id, time) in broadcastIdRecord)
                    {
                        if (now - time >= broadcastTimeout)
                        {
                            removeKeys.Add(id);
                        }
                        else
                        {
                            break;
                        }
                    }
                    foreach (var id in removeKeys)
                    {
                        broadcastIdRecord.Remove(id);
                    }
                }

                await tasks.WhenAll();
            }, null, refreshKBucketTimeSpan, refreshKBucketTimeSpan);
Exemplo n.º 3
0
        private SuperNodeClient(IClient myClient, IPEndPoint bindEP)
        {
            client         = myClient;
            system         = myClient.System;
            BindIPEndPoint = bindEP;

            serverSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
            serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);        // 启用tcp心跳
            serverSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveRetryCount, 2); // 重试次数
            serverSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveTime, 60);      // 冷却间隔秒数
            serverSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveInterval, 1);   // 重试间隔秒数
            serverSocket.Bind(bindEP);
            serverSocket.Listen(2);

            StartAccept();

            client.System.CampaignNodesChanged += CampaignNodesChanged;
            client.ReceiveBroadcast            += Client_ReceiveBroadcast;
        }