private void getAddrMsgHandle(P2PState state) { var peers = this.p2pComponent.GetNodes(); var peer = peers.Where(p => p.IP == state.IP && p.Port == state.Port).FirstOrDefault(); if (peer != null && peer.IsConnected) { var data = new GetAddrMsg(); int index = 0; data.Deserialize(state.Command.Payload, ref index); if (data.Count <= 0 || data.Count > 100) { data.Count = 100; } var list = peers.Where(p => p.IP != state.IP || p.Port != state.Port).OrderByDescending(p => p.LastHeartbeat).Take(data.Count).ToList(); var payload = new AddrMsg(); foreach (var item in list) { payload.AddressList.Add(new AddrMsg.AddressInfo() { Ip = item.IP, Port = item.Port, Identity = item.Identity }); } var addrCommand = P2PCommand.CreateCommand(this.Identity.ToString(), CommandNames.P2P.Addr, payload); this.p2pComponent.SendCommand(state.IP, state.Port, addrCommand); } }
private void getAddrMsgHandle(P2PState state) { var peer = this.Peers.Where(p => p.IP == state.IP && p.Port == state.Port).FirstOrDefault(); if (peer != null && peer.IsConnected) { var data = new GetAddrMsg(); int index = 0; data.Deserialize(state.Command.Payload, ref index); if (data.Count <= 0 || data.Count > 100) { data.Count = 100; } var list = this.Peers.Where(p => p.IP != state.IP || p.Port != state.Port).OrderByDescending(p => p.LastHeartbeat).Take(data.Count).ToList(); var payload = new AddrMsg(); foreach (var item in list) { payload.AddressList.Add(new KeyValuePair <string, int>(item.IP, item.Port)); } var addrCommand = P2PCommand.CreateCommand(CommandNames.P2P.Addr, payload); this.Send(addrCommand, state.IP, state.Port); } }
private void verAckMsgHandle(P2PState state) { var peer = this.Peers.Where(p => p.IP == state.IP && p.Port == state.Port).FirstOrDefault(); if (peer != null) { peer.IsConnected = true; peer.ConnectedTime = Time.EpochTime; peer.LastHeartbeat = Time.EpochTime; if (peer.IsTrackerServer) { var payload = new GetAddrMsg(); payload.Count = this.maxConnections; var command = P2PCommand.CreateCommand(CommandNames.P2P.GetAddr, payload); this.Send(command, peer.IP, peer.Port); } else { this.raiseNodeConnectionStateChanged(peer); } } }
private void peerCheckTimer_Elapsed(object sender, ElapsedEventArgs e) { for (int i = Peers.Count - 1; i >= 0; i--) { var peer = Peers[i]; var nowTime = Time.EpochTime; //check unconnected peers if (!peer.IsConnected) { if ((peer.ConnectedTime > nowTime || (nowTime - peer.ConnectedTime) > 1 * 60 * 1000)) { Peers.RemoveAt(i); this.receivedMessageBuffer.Remove(peer.IP + ":" + peer.Port); } } else { //check long time not received heartbeat peers if (peer.LastHeartbeat < nowTime && (nowTime - peer.LastHeartbeat) > 10 * 60 * 1000) { peer.IsConnected = false; this.raiseNodeConnectionStateChanged(peer); Peers.RemoveAt(i); this.receivedMessageBuffer.Remove(peer.IP + ":" + peer.Port); } else if (this.isTrackerNode) { var msg = new HeightMsg(); msg.Height = this.LastBlockHeight; msg.BlockTime = this.LastBlockTime; var command = P2PCommand.CreateCommand(CommandNames.P2P.Heartbeat, msg); this.Send(command, peer.IP, peer.Port); } } } if (!this.isTrackerNode) { //reconnect with tracker nodes if (this.Peers.Count == 0 || this.Peers.Where(p => p.IsTrackerServer && p.IsConnected).Count() == 0) { var trackerNode = this.Peers.Where(t => t.IsTrackerServer).FirstOrDefault(); if (trackerNode != null) { this.Peers.Remove(trackerNode); this.receivedMessageBuffer.Remove(trackerNode.IP + ":" + trackerNode.Port); } string trackerIp = GlobalParameters.IsTestnet ? Resource.TestnetTrackerServer : Resource.MainnetTrackerServer; int trackerPort = int.Parse(GlobalParameters.IsTestnet ? Resource.TestnetPort : Resource.MainnetPort); this.ConnectToNewPeer(trackerIp, trackerPort, true); } //get new node address from tracker else if (this.Peers.Count() < this.maxConnections) { var tracker = this.Peers.Where(p => p.IsTrackerServer && p.IsConnected).FirstOrDefault(); if (tracker != null) { var payload = new GetAddrMsg(); payload.Count = this.maxConnections; var command = P2PCommand.CreateCommand(CommandNames.P2P.GetAddr, payload); this.Send(command, tracker.IP, tracker.Port); } } } }