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);
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);
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; }