Exemple #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));
        }
Exemple #2
0
        private void ProcessNodesStr(IPEndPoint ipinfo, BString nodesStr)
        {
            if (nodesStr != null && nodesStr.Length != 0)
            {
                List <DHTNode> nodesList = null;
                if (nodesStr.Value.Length % DHTHelper.CompactNodeRecordLengthIP4 == 0)
                {
                    nodesList = DHTHelper.ParseNodesListIP4(nodesStr.Value);
                }
                else if (nodesStr.Value.Length % DHTHelper.CompactNodeRecordLengthIP6 == 0)
                {
                    nodesList = DHTHelper.ParseNodesListIP6(nodesStr.Value);
                }
                else
                {
                    throw new Exception("sd");
                }

                fLogger.WriteDebug("Receive {0} nodes from {1}", nodesList.Count, ipinfo.ToString());

                if (nodesList.Count > 0)
                {
                    fRoutingTable.UpdateNodes(nodesList);
                    fLastNodesUpdateTime = DateTime.Now.Ticks;
                }
            }
        }
Exemple #3
0
        public static DHTMessage CreateGetPeersResponse(
            BString transactionID, byte[] nodeId, byte[] infoHash,
            IList <IDHTPeer> peersList, IList <DHTNode> nodesList)
        {
            BList values = DHTHelper.CompactPeers(peersList);
            var   nodes  = new BString(DHTHelper.CompactNodes(nodesList));

            BDictionary sendData = new BDictionary();

            sendData.Add("t", transactionID);
            sendData.Add("y", "r");

            var r = new BDictionary();

            r.Add("id", new BString(nodeId));
            r.Add("token", new BString(infoHash.Take(2)));
            if (values != null)
            {
                r.Add("values", values);
            }
            r.Add("nodes", nodes);
            sendData.Add("r", r);

            return(new DHTMessage(MessageType.Response, QueryType.None, sendData));
        }
        public void Test_BytesToHexString()
        {
            var    bytes = new byte[] { 0xFF, 0xAF, 0x05, 0x77, 0xAB };
            string str   = DHTHelper.BytesToHexString(bytes).ToLowerInvariant();

            Assert.AreEqual("ffaf0577ab", str);
        }
        public void Test_GetRandomHashID()
        {
            var randShaId = DHTHelper.GetRandomHashID();

            Assert.IsNotNull(randShaId);
            Assert.AreEqual(20, randShaId.Length);
        }
        public void Test_GetTransactionId()
        {
            var tid = DHTHelper.GetTransactionId();

            Assert.IsNotNull(tid);
            Assert.AreEqual(2, tid.Length);
        }
Exemple #7
0
        private bool ProcessValuesStr(IPEndPoint ipinfo, BList valuesList)
        {
            bool result = false;

            if (valuesList != null && valuesList.Count != 0)
            {
                var values = DHTHelper.ParseValuesList(valuesList);

                if (values.Count > 0)
                {
                    fLogger.WriteDebug("Receive {0} values (peers) from {1}", values.Count, ipinfo.ToString());
                    RaisePeersFound(fSearchInfoHash, values);

                    // FIXME: it's temp debug code
                    foreach (var val in values)
                    {
                        SendPingQuery(val);
                        SendPingQuery(new IPEndPoint(val.Address, fLocalIP.Port));
                    }

                    result = true;
                }
            }
            return(result);
        }
        public void Test_GetNeighbor()
        {
            var bytes1 = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
            var bytes2 = new byte[] { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77 };
            var result = DHTHelper.GetNeighbor(bytes1, bytes2);

            Assert.AreEqual("1111111111111111111177777777777777777777", result.ToHexString());
        }
Exemple #9
0
        internal void SendGetPeersQuery(IPEndPoint address, byte[] infoHash)
        {
            var transactionID = DHTHelper.GetTransactionId();
            var msg           = DHTMessage.CreateGetPeersQuery(transactionID, fLocalID, infoHash);

            SetTransaction(transactionID, msg);
            Send(address, msg);
        }
Exemple #10
0
        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());
        }
Exemple #11
0
        public void Test_CreateHandshakeResponse()
        {
            var tid    = DHTHelper.GetTransactionId();
            var nodeId = DHTHelper.GetRandomID();
            var msg    = ProtocolHelper.CreateHandshakeResponse(tid, nodeId);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
Exemple #12
0
        public void Test_CreateGetPeerInfoQuery()
        {
            var tid    = DHTHelper.GetTransactionId();
            var nodeId = DHTHelper.GetRandomID();
            var msg    = ProtocolHelper.CreateGetPeerInfoQuery(tid, nodeId);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
Exemple #13
0
        public void Test_CreateChatMessage()
        {
            var tid    = DHTHelper.GetTransactionId();
            var nodeId = DHTHelper.GetRandomID();
            var msg    = ProtocolHelper.CreateChatMessage(tid, nodeId, "test");

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
Exemple #14
0
        public void Test_UpdateNode()
        {
            var table = new DHTRoutingTable(10);

            table.UpdateNode(null);

            var node = new DHTNode(DHTHelper.GetRandomID(), new IPEndPoint(IPAddress.Any, 0));

            table.UpdateNode(node);
        }
        public void Test_CreateAnnouncePeerResponse()
        {
            var        tid    = DHTHelper.GetTransactionId();
            var        nodeId = DHTHelper.GetRandomID();
            DHTMessage msg    = DHTMessage.CreateAnnouncePeerResponse(tid, nodeId, new List <DHTNode>());

            Assert.IsNotNull(msg);
            Assert.AreEqual(MessageType.Response, msg.Type);
            // TODO: test contents
        }
Exemple #16
0
        public void Test_PeersFoundEventArgs()
        {
            byte[]            infoHash = DHTHelper.GetRandomHashID();
            List <IPEndPoint> peers    = new List <IPEndPoint>();
            var evt = new PeersFoundEventArgs(infoHash, peers);

            Assert.IsNotNull(evt);
            Assert.AreEqual(infoHash, evt.InfoHash);
            Assert.AreEqual(peers, evt.Peers);
        }
Exemple #17
0
        internal void SendPingQuery(IPEndPoint address)
        {
            fLogger.WriteDebug("Send peer ping {0}", address);

            var transactionID = DHTHelper.GetTransactionId();
            var msg           = DHTMessage.CreatePingQuery(transactionID, fLocalID);

            SetTransaction(transactionID, msg);
            Send(address, msg);
        }
Exemple #18
0
        public void Test_PeerPingedEventArgs()
        {
            IPEndPoint peerEndPoint = new IPEndPoint(IPAddress.Any, 1111);

            byte[] nodeId = DHTHelper.GetRandomID();
            var    evt    = new PeerPingedEventArgs(peerEndPoint, nodeId);

            Assert.IsNotNull(evt);
            Assert.AreEqual(peerEndPoint, evt.EndPoint);
            Assert.AreEqual(nodeId, evt.NodeId);
        }
Exemple #19
0
        private void SendFindNodeQuery(IPEndPoint address, byte[] data)
        {
            var transactionID = DHTHelper.GetTransactionId();

            byte[] nid = (data == null) ? fLocalID : DHTHelper.GetNeighbor(data, fLocalID);

            BDictionary sendData = DHTMessage.CreateFindNodeQuery(transactionID, nid);

            SetTransaction(transactionID, new DHTMessage(MsgType.query, QueryType.find_node, sendData));
            Send(address, sendData);
        }
        public void Test_CreateFindNodeQuery()
        {
            var        tid    = DHTHelper.GetTransactionId();
            var        nodeId = DHTHelper.GetRandomID();
            DHTMessage msg    = DHTMessage.CreateFindNodeQuery(tid, nodeId);

            Assert.IsNotNull(msg);
            Assert.AreEqual(MessageType.Query, msg.Type);
            Assert.AreEqual(QueryType.FindNode, msg.QueryType);
            // TODO: test contents
        }
Exemple #21
0
        internal void SendFindNodeQuery(IPEndPoint address, byte[] data)
        {
            var transactionID = DHTHelper.GetTransactionId();

            byte[] nid = (data == null) ? fLocalID : DHTHelper.GetNeighbor(data, fLocalID);

            var msg = DHTMessage.CreateFindNodeQuery(transactionID, nid);

            SetTransaction(transactionID, msg);
            Send(address, msg);
        }
Exemple #22
0
        private void SendGetPeersQuery(IPEndPoint address, byte[] infoHash)
        {
            var transactionID = DHTHelper.GetTransactionId();

            byte[] nid = fLocalID;

            BDictionary sendData = DHTMessage.CreateGetPeersQuery(transactionID, nid, infoHash);

            SetTransaction(transactionID, new DHTMessage(MsgType.query, QueryType.get_peers, sendData));
            Send(address, sendData);
        }
        public void Test_CreateGetPeersQuery()
        {
            var        tid      = DHTHelper.GetTransactionId();
            var        nodeId   = DHTHelper.GetRandomID();
            var        infoHash = DHTHelper.GetRandomHashID();
            DHTMessage msg      = DHTMessage.CreateGetPeersQuery(tid, nodeId, infoHash);

            Assert.IsNotNull(msg);
            Assert.AreEqual(MessageType.Query, msg.Type);
            Assert.AreEqual(QueryType.GetPeers, msg.QueryType);
            // TODO: test contents
        }
Exemple #24
0
        private void SendShakeHand()
        {
            var peer = DHTHelper.GetRandomHashID();
            var list = new List <byte>();

            list.Add(0x13);
            list.AddRange(Encoding.ASCII.GetBytes("BitTorrent protocol"));
            list.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 });
            list.AddRange(InfoHash);
            list.AddRange(peer);
            fSocket.Send(list.ToArray(), SocketFlags.None);
        }
        public void Test_CreateAnnouncePeerQuery()
        {
            var        tid      = DHTHelper.GetTransactionId();
            var        nodeId   = DHTHelper.GetRandomID();
            var        infoHash = DHTHelper.GetRandomHashID();
            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
        }
        public void Test_CreateGetPeersResponse()
        {
            var        tid      = DHTHelper.GetTransactionId();
            var        nodeId   = DHTHelper.GetRandomID();
            var        infoHash = DHTHelper.GetRandomHashID();
            var        peers    = new List <IDHTPeer>();
            var        nodes    = new List <DHTNode>();
            DHTMessage msg      = DHTMessage.CreateGetPeersResponse(tid, nodeId, infoHash, peers, nodes);

            Assert.IsNotNull(msg);
            Assert.AreEqual(MessageType.Response, msg.Type);
            // TODO: test contents
        }
Exemple #27
0
        public void Test_ctor2()
        {
            var endPoint = new IPEndPoint(IPAddress.Any, 0);
            var randId   = DHTHelper.GetRandomID();
            var node     = new DHTNode(randId, endPoint);

            Assert.IsNotNull(node);
            Assert.AreEqual(randId, node.ID);
            Assert.AreEqual(endPoint, node.EndPoint);

            Assert.AreEqual(0, node.LastAnnouncementTime);
            Assert.AreEqual(0, node.LastUpdateTime);
        }
Exemple #28
0
        public void Test_MessageEventArgs()
        {
            IPEndPoint peerEndPoint = new IPEndPoint(IPAddress.Any, 1111);

            byte[]      nodeId = DHTHelper.GetRandomID();
            BDictionary data   = new BDictionary();
            var         evt    = new MessageEventArgs(peerEndPoint, nodeId, data);

            Assert.IsNotNull(evt);
            Assert.AreEqual(peerEndPoint, evt.EndPoint);
            Assert.AreEqual(nodeId, evt.NodeId);
            Assert.AreEqual(data, evt.Data);
        }
Exemple #29
0
        public void Test_CreateGetPeerInfoResponse()
        {
            var peerInfo = new PeerProfile();

            peerInfo.ResetSystem();

            var tid    = DHTHelper.GetTransactionId();
            var nodeId = DHTHelper.GetRandomID();
            var msg    = ProtocolHelper.CreateGetPeerInfoResponse(tid, nodeId, peerInfo);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
Exemple #30
0
        private void SendPingQuery(IPEndPoint address)
        {
            fLogger.WriteDebug("Send peer ping " + address.ToString());

            var transactionID = DHTHelper.GetTransactionId();

            byte[] nid = fLocalID;

            BDictionary sendData = DHTMessage.CreatePingQuery(transactionID, nid);

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