示例#1
0
        private void OnRecvAnnouncePeerQuery(IPEndPoint ipinfo, BDictionary data)
        {
            var t    = data.Get <BString>("t");
            var args = data.Get <BDictionary>("a");

            var id          = args.Get <BString>("id");
            var infoHash    = args.Get <BString>("info_hash");
            var impliedPort = args.Get <BNumber>("implied_port");
            int port        = (impliedPort != null && impliedPort.Value == 1) ? ipinfo.Port : (int)args.Get <BNumber>("port").Value;

            fLogger.WriteDebug("Receive `announce_peer` query from {0} [{1}] for {2}", ipinfo.ToString(), id.Value.ToHexString(), infoHash.Value.ToHexString());

            fRoutingTable.UpdateNode(new DHTNode(id.Value, ipinfo));

            if (!DHTHelper.ArraysEqual(infoHash.Value, fSearchInfoHash))
            {
                // skip response for another infohash query
                return;
            }

            // receive `announce_peer` query for our infohash
            var nodesList = fRoutingTable.FindNodes(infoHash.Value);

            Send(ipinfo, DHTMessage.CreateAnnouncePeerResponse(t, fLocalID, nodesList));
        }
示例#2
0
        private void OnRecvGetPeersQuery(IPEndPoint ipinfo, BDictionary data)
        {
            var t    = data.Get <BString>("t");
            var args = data.Get <BDictionary>("a");

            var id       = args.Get <BString>("id");
            var infoHash = args.Get <BString>("info_hash");

            fLogger.WriteDebug("Receive `get_peers` query from {0} [{1}] for {2}", ipinfo.ToString(), id.Value.ToHexString(), infoHash.Value.ToHexString());

            fRoutingTable.UpdateNode(new DHTNode(id.Value, ipinfo));

            var neighbor  = DHTHelper.GetNeighbor(infoHash.Value, fLocalID);
            var peersList = (DHTHelper.ArraysEqual(infoHash.Value, fSearchInfoHash)) ? fPeersHolder.GetPeersList() : null;
            var nodesList = fRoutingTable.FindNodes(infoHash.Value);

            Send(ipinfo, DHTMessage.CreateGetPeersResponse(t, neighbor, infoHash.Value, peersList, nodesList));
        }
        /*public void UpdateNodes(IEnumerable<DHTNode> nodes)
         * {
         *  foreach (var node in nodes) {
         *      UpdateNode(node);
         *  }
         * }*/

        public void UpdateNode(DHTNode node)
        {
            if (node == null || node.ID == null)
            {
                return;
            }

            if (fKTable.Count >= fMaxNodeSize && fMinLastTime + fRouteLife.Ticks < DateTime.Now.Ticks)
            {
                lock (this) {
                    if (fMinLastTime + fRouteLife.Ticks < DateTime.Now.Ticks)
                    {
                        ClearExpireNode();
                    }
                }
            }

            if (fKTable.Count >= fMaxNodeSize)
            {
                return;
            }

            DHTNode existNode = null;

            if (fKTable.TryGetValue(node.RouteId, out existNode))
            {
                if (DHTHelper.ArraysEqual(node.ID, existNode.ID))
                {
                    node = existNode;
                }
                else
                {
                    // replace to new
                    fKTable[node.RouteId] = node;
                }
            }
            else
            {
                fKTable.Add(node.RouteId, node);
            }

            node.LastUpdateTime = DateTime.Now.Ticks;
        }