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 = new DHTId(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; var remoteNode = new DHTNode(id.Value, ipinfo); UpdateRoutingTable(remoteNode); #if DEBUG_DHT_INTERNALS fLogger.WriteDebug("Receive `announce_peer` query from {0} for {1}", remoteNode.ToString(), infoHash.ToString()); #endif // skip response for another infohash query if (infoHash == fSearchInfoHash) { // receive `announce_peer` query for our infohash var nodesList = fRoutingTable.GetClosest(infoHash.Data); Send(ipinfo, DHTMessage.CreateAnnouncePeerResponse(t, fLocalID, nodesList)); if (PeersFound != null) { PeersFound(this, new PeersFoundEventArgs(new List <IPEndPoint>() { ipinfo })); } } }
public void Test_ToString() { var endPoint = new IPEndPoint(IPAddress.Any, 0); var randId = DHTHelper.GetRandomID(); var node = new DHTNode(randId, endPoint); Assert.IsNotNullOrEmpty(node.ToString()); }
public void Test_DHTNode() { var endPoint = new IPEndPoint(IPAddress.Any, 0); var randId = DHTId.CreateRandom(); var node = new DHTNode(randId, endPoint); Assert.IsNotNull(node); Assert.AreEqual(randId.Data, node.Id.Data); Assert.AreEqual(endPoint, node.EndPoint); Assert.IsNotNullOrEmpty(node.ToString()); Assert.AreEqual(0, node.LastAnnouncementTime); Assert.AreEqual(0, node.LastUpdateTime); }
private void OnRecvPingQuery(IPEndPoint ipinfo, BDictionary data) { var t = data.Get <BString>("t"); var args = data.Get <BDictionary>("a"); var id = args.Get <BString>("id"); var remoteNode = new DHTNode(id.Value, ipinfo); UpdateRoutingTable(remoteNode); #if DEBUG_DHT_INTERNALS fLogger.WriteDebug("Receive `ping` query from {0}", remoteNode.ToString()); #endif Send(ipinfo, DHTMessage.CreatePingResponse(t, fLocalID)); }
private void OnRecvFindNodeQuery(IPEndPoint ipinfo, BDictionary data) { var t = data.Get <BString>("t"); var args = data.Get <BDictionary>("a"); var id = args.Get <BString>("id"); var target = args.Get <BString>("target"); var remoteNode = new DHTNode(id.Value, ipinfo); UpdateRoutingTable(remoteNode); #if DEBUG_DHT_INTERNALS fLogger.WriteDebug("Receive `find_node` query from {0}", remoteNode.ToString()); #endif var nodesList = fRoutingTable.GetClosest(target.Value); Send(ipinfo, DHTMessage.CreateFindNodeResponse(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 = new DHTId(args.Get <BString>("info_hash")); var remoteNode = new DHTNode(id.Value, ipinfo); UpdateRoutingTable(remoteNode); #if DEBUG_DHT_INTERNALS fLogger.WriteDebug("Receive `get_peers` query from {0} for {1}", remoteNode.ToString(), infoHash.ToString()); #endif var neighbor = DHTNode.GetNeighbor(infoHash.Data, fLocalID.Data); var peersList = (infoHash == fSearchInfoHash) ? fPeersHolder.GetPeersList() : null; var nodesList = fRoutingTable.GetClosest(infoHash.Data); Send(ipinfo, DHTMessage.CreateGetPeersResponse(t, neighbor, infoHash, peersList, nodesList)); }