Exemplo n.º 1
0
 private void raiseNodeConnectionStateChanged(P2PNode node)
 {
     if (this.NodeConnectionStateChanged != null)
     {
         NodeConnectionStateChanged(node);
     }
 }
Exemplo n.º 2
0
        private void pingMsgHandle(P2PState state)
        {
            var peer = this.Peers.Where(p => p.IP == state.IP && p.Port == state.Port).FirstOrDefault();

            if (peer == null)
            {
                if (this.Peers.Count < this.maxConnections)
                {
                    var newPeer = new P2PNode();
                    newPeer.IP              = state.IP;
                    newPeer.Port            = state.Port;
                    newPeer.IsConnected     = false;
                    newPeer.ConnectedTime   = Time.EpochTime;
                    newPeer.IsTrackerServer = false;
                    newPeer.IsInbound       = true;

                    this.Peers.Add(newPeer);

                    if (this.receivedMessageBuffer.ContainsKey(state.IP + ":" + state.Port))
                    {
                        this.receivedMessageBuffer[state.IP + ":" + state.Port] = new List <byte>();
                    }
                    else
                    {
                        this.receivedMessageBuffer.Add(state.IP + ":" + state.Port, new List <byte>());
                    }

                    var pongCommand = P2PCommand.CreateCommand(CommandNames.P2P.Pong, null);
                    this.Send(pongCommand, newPeer.IP, newPeer.Port);

                    var verPayload = new VersionMsg();
                    verPayload.Version   = Versions.EngineVersion;
                    verPayload.Timestamp = Time.EpochTime;

                    var versionCommand = P2PCommand.CreateCommand(CommandNames.P2P.Version, verPayload);
                    this.Send(versionCommand, state.IP, state.Port);
                }
                else
                {
                    var payload = new RejectMsg();
                    payload.ReasonCode = ErrorCode.Engine.P2P.Connection.THE_NUMBER_OF_CONNECTIONS_IS_FULL;

                    var rejectCommand = P2PCommand.CreateCommand(CommandNames.Other.Reject, payload);
                    this.Send(rejectCommand, state.IP, state.Port);
                }
            }
            else
            {
                var pongCommand = P2PCommand.CreateCommand(CommandNames.P2P.Pong, null);
                this.Send(pongCommand, state.IP, state.Port);

                var verPayload = new VersionMsg();
                verPayload.Version   = Versions.EngineVersion;
                verPayload.Timestamp = Time.EpochTime;

                var versionCommand = P2PCommand.CreateCommand(CommandNames.P2P.Version, verPayload);
                this.Send(versionCommand, state.IP, state.Port);

                if (!this.receivedMessageBuffer.ContainsKey(state.IP + ":" + state.Port))
                {
                    this.receivedMessageBuffer.Add(state.IP + ":" + state.Port, new List <byte>());
                }

                //var payload = new RejectMsg();
                //payload.ReasonCode = ErrorCode.Engine.P2P.Connection.THE_PEER_IS_EXISTED;

                //var rejectCommand = P2PCommand.CreateCommand(CommandNames.Other.Reject, payload);
                //this.Send(rejectCommand, state.IP, state.Port);
            }
        }
Exemplo n.º 3
0
        public bool ConnectToNewPeer(string address, int port, bool isTracker = false)
        {
            IPAddress ip;

            if (!IPAddress.TryParse(address, out ip))
            {
                try
                {
                    var ips = Dns.GetHostAddresses(address);

                    if (ips.Length > 0)
                    {
                        ip      = ips[0];
                        address = ip.ToString();
                    }
                    else
                    {
                        throw new CommonException(ErrorCode.Engine.P2P.Connection.HOST_NAME_CAN_NOT_RESOLVED_TO_IP_ADDRESS);
                    }
                }
                catch
                {
                    throw new CommonException(ErrorCode.Engine.P2P.Connection.HOST_NAME_CAN_NOT_RESOLVED_TO_IP_ADDRESS);
                }
            }

            if (BlackList.Contains(address + ":" + port))
            {
                throw new CommonException(ErrorCode.Engine.P2P.Connection.PEER_IN_BLACK_LIST);
            }

            var peer = this.Peers.Where(p => p.IP == address && p.Port == port).FirstOrDefault();

            if (peer != null)
            {
                //if (!this.receivedMessageBuffer.ContainsKey(address + ":" + port))
                //{
                //    this.receivedMessageBuffer.Add(address + ":" + port, new List<byte>());
                //}
                ////else
                ////{
                ////    this.receivedMessageBuffer[address + ":" + port] = new List<byte>();
                ////}

                ////var command = P2PCommand.CreateCommand(CommandNames.P2P.Ping, null);
                ////this.Send(command, peer.IP, peer.Port);

                //LogHelper.Debug(DateTime.Now + " Connect to " + address);
                ////return true;
                //throw new CommonException(ErrorCode.Engine.P2P.Connection.THE_PEER_IS_EXISTED);

                return(false);
            }
            else
            {
                if (this.Peers.Count >= this.maxConnections)
                {
                    throw new CommonException(ErrorCode.Engine.P2P.Connection.THE_NUMBER_OF_CONNECTIONS_IS_FULL);
                }

                peer                 = new P2PNode();
                peer.IP              = address;
                peer.Port            = port;
                peer.IsConnected     = false;
                peer.ConnectedTime   = Time.EpochTime;
                peer.IsTrackerServer = isTracker;
                peer.IsInbound       = false;

                this.Peers.Add(peer);

                if (this.receivedMessageBuffer.ContainsKey(address + ":" + port))
                {
                    this.receivedMessageBuffer[address + ":" + port] = new List <byte>();
                }
                else
                {
                    this.receivedMessageBuffer.Add(address + ":" + port, new List <byte>());
                }

                var command = P2PCommand.CreateCommand(CommandNames.P2P.Ping, null);
                this.Send(command, peer.IP, peer.Port);

                LogHelper.Debug(DateTime.Now + " Connect to " + address);
                return(true);
            }
        }