Exemplo n.º 1
0
        public bool CheckPeer(IPEndPoint peerEndPoint)
        {
            bool result = false;

            if (peerEndPoint == null)
            {
                return(false);
            }

            var  peerAddress = peerEndPoint.Address;
            Peer peer        = FindPeer(peerAddress);

            if (peer == null)
            {
                peer   = AddPeer(peerAddress, peerEndPoint.Port);
                result = true;
            }

            if (peer.State != PeerState.Checked && !peer.IsLocal)
            {
                peer.EndPoint.Port = peerEndPoint.Port;
                peer.State         = PeerState.Checked;
                result             = true;
            }

            SendData(peer.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery(DHTHelper.GetTransactionId(), fDHTClient.LocalID));

            return(result);
        }
Exemplo n.º 2
0
        private void OnResponseReceive(object sender, MessageEventArgs e)
        {
            fLogger.WriteDebug("Response received: {0} :: {1}", e.EndPoint, e.Data.EncodeAsString());

            var pr = FindPeer(e.EndPoint.Address);

            var    resp      = e.Data.Get <BDictionary>("r");
            var    qt        = resp.Get <BString>("q");
            string queryType = (qt != null) ? qt.ToString() : "";

            switch (queryType)
            {
            case "handshake":
                if (pr != null)
                {
                    pr.State = PeerState.Checked;
                    SendData(e.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery(DHTHelper.GetTransactionId(), fDHTClient.LocalID));
                }
                break;

            case "get_peer_info":
                if (pr != null)
                {
                    pr.Profile.Load(resp);
                }
                break;
            }
        }
        /// <summary>
        /// Peer confirmation after receiving a ping from it.
        /// </summary>
        /// <param name="peerEndPoint"></param>
        /// <returns></returns>
        public bool CheckPeer(IPEndPoint peerEndPoint)
        {
            bool result = false;

            if (peerEndPoint == null)
            {
                return(false);
            }

            Peer peer = FindPeer(peerEndPoint);

            if (peer == null)
            {
                // ping can come from various sources,
                // if a node with such an endpoint is not found - then the source is not a peer
                return(false);
            }

            peer.PingTries = 0;

            if (peer.State != PeerState.Checked && !peer.IsLocal)
            {
                peer.State = PeerState.Checked;
                SendData(peer.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery(DHTTransactions.GetNextId(), fDHTClient.LocalID));
                result = true;
            }

            return(result);
        }
Exemplo n.º 4
0
        public void Test_CreateGetPeerInfoQuery()
        {
            var tid    = DHTTransactions.GetNextId();
            var nodeId = DHTId.CreateRandom();
            var msg    = ProtocolHelper.CreateGetPeerInfoQuery(tid, nodeId);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
Exemplo n.º 5
0
        public CommunicatorCore(IChatForm form)
        {
            if (form == null)
            {
                throw new ArgumentNullException("form");
            }

            fConnected = false;
            fForm      = form;
            fLogger    = LogManager.GetLogger(ProtocolHelper.LOG_FILE, ProtocolHelper.LOG_LEVEL, "ChatDHTCP");
            fProfile   = new UserProfile();
            fParser    = new BencodeParser();
            fPeers     = new List <Peer>();
            fSTUNInfo  = null;

            int dhtPort = DHTClient.PublicDHTPort;

            fDHTClient             = new DHTClient(DHTClient.IPAnyAddress, dhtPort, this, CLIENT_VER);
            fDHTClient.PeersFound += delegate(object sender, PeersFoundEventArgs e) {
                fLogger.WriteInfo(string.Format("Found DHT peers: {0}", e.Peers.Count));

                bool changed = false;
                foreach (var p in e.Peers)
                {
                    changed = UpdatePeer(p);
                }

                if (changed)
                {
                    fForm.OnPeersListChanged();
                }
            };
            fDHTClient.PeerPinged += delegate(object sender, PeerPingedEventArgs e) {
                fLogger.WriteInfo(string.Format("Peer pinged: {0}", e.EndPoint));

                bool changed = CheckPeer(e.EndPoint);

                if (changed)
                {
                    fForm.OnPeersListChanged();
                    SendData(e.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery());
                }
            };
            fDHTClient.QueryReceived    += OnQueryReceive;
            fDHTClient.ResponseReceived += OnResponseReceive;

            NATHolePunching();

            fTCPClient              = new TCPDuplexClient();
            fTCPClient.DataReceive += OnDataReceive;
        }