Exemplo n.º 1
0
        internal void SendAnnouncePeerQuery(DHTNode remoteNode, DHTId infoHash, byte implied_port, int port, BString token)
        {
            if (remoteNode == null || token == null || token.Length == 0)
            {
                return;
            }

            long nowTicks = DateTime.UtcNow.Ticks;

            if (nowTicks - remoteNode.LastAnnouncementTime < AnnounceLife.Ticks)
            {
                return;
            }
            remoteNode.LastAnnouncementTime = nowTicks;

#if DEBUG_DHT_INTERNALS
            fLogger.WriteDebug("Send announce peer query {0}, {1}, {2}", remoteNode.EndPoint, implied_port, port);
#endif

            // https://www.bittorrent.org/beps/bep_0005.html
            // If implied_port (0/1) is present and non-zero, the port argument should be ignored
            // and the source port of the UDP packet should be used as the peer's port instead.

            var transactionID = DHTTransactions.GetNextId();
            var msg           = DHTMessage.CreateAnnouncePeerQuery(transactionID, fLocalID, infoHash, implied_port, port, token);
            fTransactions.SetQuery(transactionID, msg);
            Send(remoteNode.EndPoint, msg);
        }
Exemplo n.º 2
0
        public void Test_CreateAnnouncePeerQuery()
        {
            var        tid      = DHTTransactions.GetNextId();
            var        nodeId   = DHTId.CreateRandom();
            var        infoHash = DHTId.CreateRandom();
            DHTMessage msg      = DHTMessage.CreateAnnouncePeerQuery(tid, nodeId, infoHash, 1, 1, new BString("XX"));

            Assert.IsNotNull(msg);
            Assert.AreEqual(MessageType.Query, msg.Type);
            Assert.AreEqual(QueryType.AnnouncePeer, msg.QueryType);
            // TODO: test contents
        }
Exemplo n.º 3
0
        internal void SendAnnouncePeerQuery(IPEndPoint address, byte[] infoHash, byte implied_port, int port, BString token)
        {
            DHTNode node = fRoutingTable.FindNode(address);

            if (node != null)
            {
                long nowTicks = DateTime.Now.Ticks;
                if (nowTicks - node.LastAnnouncementTime < AnnounceLife.Ticks)
                {
                    return;
                }
                node.LastAnnouncementTime = nowTicks;
                // TODO: update announce by timer, every 30m
            }

            var transactionID = DHTHelper.GetTransactionId();
            var msg           = DHTMessage.CreateAnnouncePeerQuery(transactionID, fLocalID, infoHash, implied_port, port, token);

            SetTransaction(transactionID, msg);
            Send(address, msg);
        }
Exemplo n.º 4
0
        public void SendAnnouncePeerQuery(IPEndPoint address, byte[] infoHash, byte implied_port, int port, BString token)
        {
            DHTNode node = fRoutingTable.FindNode(address);

            if (node != null)
            {
                long nowTicks = DateTime.Now.Ticks;
                if (nowTicks - node.LastAnnouncementTime < AnnounceLife.Ticks)
                {
                    return;
                }
                node.LastAnnouncementTime = nowTicks;
                // TODO: update announce by timer, every 30m
            }

            var transactionID = DHTHelper.GetTransactionId();

            byte[] nid = fLocalID;

            BDictionary sendData = DHTMessage.CreateAnnouncePeerQuery(transactionID, nid, infoHash, implied_port, port, token);

            SetTransaction(transactionID, new DHTMessage(MsgType.query, QueryType.announce_peer, sendData));
            Send(address, sendData);
        }