예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
        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);
                    }
                }
            }
        }