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)); }
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; }