Exemple #1
0
        /// <summary>
        /// 创建异常数据
        /// </summary>
        /// <param name="e">异常数据</param>
        /// <returns>返回异常数据节点</returns>
        static DictNode CreateExceptionNode(Exception e)
        {
            DictNode result = new DictNode();

            result.Add("code", 4);
            result.Add("message", string.Format("{0}: {1}", e.GetType(), e.Message));
            return(result);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        private byte[] BuildAckMessage(byte[] key, byte[] iv)
        {
            DictNode node = new DictNode();

            node.Add("key", key);
            node.Add("iv", iv);
            return(BEncode.ByteArrayEncode(node));
        }
Exemple #3
0
        /// <summary>
        /// 新建握手数据包
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">初始化向量</param>
        /// <returns>返回握手数据包</returns>
        public static byte[] BuildHandshake(byte[] key, byte[] iv)
        {
            DictNode node = new DictNode();

            node.Add("key", key);
            node.Add("iv", iv);
            return(BEncode.ByteArrayEncode(node));
        }
Exemple #4
0
        public void TestDecodeHandler1()
        {
            byte[]   source = File.ReadAllBytes(@"E:\Bittorrent\Torrents\winedt70.exe.torrent");
            DictNode dh     = (DictNode)BEncodingFactory.Decode(source);

            Assert.AreEqual("http://192.168.1.150:8080/announce", (dh["announce"] as BytesNode).StringText);
            Assert.AreEqual("http://192.168.1.150:8080/announce", _encoding.GetString((dh["announce"] as BytesNode).ByteArray));
        }
Exemple #5
0
        /// <summary>
        /// 验证握手数据包
        /// </summary>
        /// <param name="handshake">握手数据包</param>
        /// <param name="key">密钥</param>
        /// <param name="iv">初始化向量</param>
        /// <returns>如果验证成功返回true;否则返回false</returns>
        public static bool VerifyHandshake(byte[] handshake, byte[] key, byte[] iv)
        {
            DictNode node = (DictNode)BEncode.Decode(handshake);

            byte[] handshakeKey = ((BytesNode)node["key"]).ByteArray;
            byte[] handshakeIV  = ((BytesNode)node["iv"]).ByteArray;
            return(BytesComparer.Compare(handshakeKey, key) && BytesComparer.Compare(handshakeIV, iv));
        }
Exemple #6
0
        /// <summary>
        /// 建立失败打开数据包
        /// </summary>
        /// <param name="message">失败消息</param>
        /// <returns>返回数据包</returns>
        private byte[] BuildFailOpenPacket(string message)
        {
            DictNode result = new DictNode();

            result.Add("code", 6);
            result.Add("message", message);
            return(BEncode.ByteArrayEncode(result));
        }
Exemple #7
0
        /// <summary>
        /// 建立成功打开数据包
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">初始化向量</param>
        /// <returns>返回数据包</returns>
        private byte[] BuildSuccessOpenPacket(byte[] key, byte[] iv)
        {
            DictNode result = new DictNode();

            result.Add("code", 1);
            result.Add("key", key);
            result.Add("iv", iv);
            return(BEncode.ByteArrayEncode(result));
        }
Exemple #8
0
        /// <summary>
        /// 记录数据包
        /// </summary>
        /// <param name="buffer">待记录的数据包</param>
        /// <param name="endPoint">IP端点</param>
        public override void Write(byte[] buffer, IPEndPoint endPoint)
        {
            DictNode node = new DictNode();

            node.Add("buffer", buffer);
            node.Add("endpoint", endPoint.ToString());
            byte[] sndMsg = BEncode.ByteArrayEncode(node);
            handler.SendNormalPacket(sndMsg);
        }
Exemple #9
0
        /// <summary>
        /// 建立打开DB Proxy Server包
        /// </summary>
        /// <returns>返回数据包</returns>
        private byte[] BuildOpenPacket()
        {
            DictNode rootNode = new DictNode();

            rootNode.Add("action", 1);
            rootNode.Add("deviceid", deviceId);
            rootNode.Add("priority", priority);
            return(BEncode.ByteArrayEncode(rootNode));
        }
Exemple #10
0
        /// <summary>
        /// 建立连接包
        /// </summary>
        /// <returns></returns>
        private byte[] BuildHandshakeMessage()
        {
            DictNode node = new DictNode();

            node.Add("port", clientPort);
            node.Add("key", key);
            node.Add("iv", iv);
            return(BEncode.ByteArrayEncode(node));
        }
Exemple #11
0
        /// <summary>
        /// 创建SQL文本的命令
        /// </summary>
        /// <param name="node">待解析的节点</param>
        /// <returns>返回SQL文本的命令</returns>
        internal static DbCommand CreateTextCommand(DictNode node)
        {
            DbCommand result  = new SqlCommand();
            string    cmdText = ((BytesNode)node["text"]).StringText;

            result.CommandText = cmdText;
            result.CommandType = CommandType.Text;
            return(result);
        }
Exemple #12
0
        public override object ExecuteScalar()
        {
            DictNode contentNode = new DictNode();

            contentNode.Add("action", 5);
            byte[] sendMsg = BuildMessage(contentNode);
            connection.SendPacket(sendMsg);
            byte[] rcvMsg = connection.ReceivePacket();
            return(DecodeScalar(rcvMsg));
        }
Exemple #13
0
        public override int ExecuteNonQuery()
        {
            DictNode contentNode = new DictNode();

            contentNode.Add("action", 3);
            byte[] sendMsg = BuildMessage(contentNode);
            connection.SendPacket(sendMsg);
            byte[] rcvMsg = connection.ReceivePacket();
            return(DecodeNonQuery(rcvMsg));
        }
Exemple #14
0
        public T Lookup(char[] key)
        {
            DictNode dn = LookupImpl(key);

            if (dn == null)
            {
                return(default(T));
            }
            return(dn.Value);
        }
Exemple #15
0
        private void HandleParmsNode(BEncodedNode parmlistNode)
        {
            ListNode parmsNode = (ListNode)parmlistNode;

            foreach (BEncodedNode node in parmsNode)
            {
                DictNode parmNode = (DictNode)node;
                string   name     = ((BytesNode)parmNode["name"]).StringText;
                string   typeName = ((BytesNode)parmNode["type"]).StringText;
                parameters[name].Value = NodeEncoder.GetObject(typeName, (BytesNode)parmNode["value"]);
            }
        }
Exemple #16
0
        public new DbProxyDataReader ExecuteReader()
        {
            DbProxyDataReader result = new DbProxyDataReader(this);

            DictNode contentNode = new DictNode();

            contentNode.Add("action", 4);
            byte[] sendMsg = BuildMessage(contentNode);
            connection.SendPacket(sendMsg);
            byte[] rcvMsg = connection.ReceivePacket();
            DecodeReader(rcvMsg, result.SchemaTable);
            return(result);
        }
Exemple #17
0
        /// <summary>
        /// 创建类型节点
        /// </summary>
        /// <param name="rdr">数据库读取器</param>
        /// <returns>返回类型节点</returns>
        private ListNode CreateTypeListNode(IDataRecord rdr)
        {
            ListNode result = new ListNode();

            for (int i = 0; i < rdr.FieldCount; i++)
            {
                DictNode columnNode = new DictNode();
                columnNode.Add("name", rdr.GetName(i));
                columnNode.Add("type", rdr.GetDataTypeName(i));
                result.Add(columnNode);
            }
            return(result);
        }
Exemple #18
0
        /// <summary>
        /// 创建Scalar返回值节点
        /// </summary>
        /// <param name="obj">Scalar返回值</param>
        /// <returns>返回Scalar返回值节点</returns>
        private BEncodedNode CreateItemNode(object obj)
        {
            string typeName = obj != null?obj.GetType().ToString() : typeof(object).ToString();

            BytesNode valueNode = obj != null
                                      ? typeName != "System.Byte[]" ? new BytesNode(obj.ToString()) : (byte[])obj
                                      : BytesNode.NullBytesNode;
            DictNode result = new DictNode();

            result.Add("type", typeName);
            result.Add("value", valueNode);
            return(result);
        }
Exemple #19
0
        /// <summary>
        /// 处理Reader函数
        /// </summary>
        /// <param name="cmd">数据库命令</param>
        public DictNode HandleReader(DbCommand cmd)
        {
            DictNode result = new DictNode();

            using (DbConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                cmd.Connection = conn;
                using (DbDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    ListNode typeListNode = CreateTypeListNode(rdr);
                    result.Add("typelist", typeListNode);

                    ListNode itemsNode = new ListNode();
                    while (rdr.Read())
                    {
                        ListNode itemNode = new ListNode();
                        for (int i = 0; i < rdr.FieldCount; i++)
                        {
                            if (rdr.IsDBNull(i))
                            {
                                itemNode.Add(BytesNode.NullBytesNode);
                            }
                            else
                            {
                                if (IsBinaryType(rdr.GetDataTypeName(i)))
                                {
                                    itemNode.Add((byte[])rdr.GetValue(i));
                                }
                                else
                                {
                                    itemNode.Add(rdr.GetValue(i).ToString());
                                }
                            }
                        }
                        itemsNode.Add(itemNode);
                    }
                    result.Add("items", itemsNode);
                }
            }
            result.Add("code", 2);

            ListNode parmlistNode = CreateParmListNode(cmd);

            if (parmlistNode.Count != 0)
            {
                result.Add("parmlist", parmlistNode);
            }
            return(result);
        }
Exemple #20
0
        private byte[] BuildMessage(DictNode contentNode)
        {
            switch (commandType)
            {
            case CommandType.Text:
                contentNode.Add("type", TextNum);
                return(BuildTextMessage(contentNode));

            case CommandType.StoredProcedure:
                contentNode.Add("type", ProcNum);
                return(BuildProcMessage(contentNode));
            }
            throw new DbProxyException("建立传输数据出错!");
        }
Exemple #21
0
        /// <summary>
        /// 交互函数
        /// </summary>
        /// <param name="stateInfo"></param>
        internal void Exchange(object stateInfo)
        {
            try
            {
                isClose = false;
                do
                {
                    byte[]   rcvMsg       = handler.ReceiveSealedPacket();
                    DictNode responseNode = HandlePacket(rcvMsg);
                    byte[]   sndMsg       = BEncode.ByteArrayEncode(responseNode);
                    handler.SendSealedPacket(sndMsg);
                    if (isClose)
                    {
                        return;
                    }
                } while (true);
            }

            catch (TdsException te)
            {
                Console.WriteLine("Tds Exception:{0}", te.Message);
            }

            catch (PacketException pe)
            {
                Console.WriteLine("Packet Exception:{0}", pe.Message);
            }

            catch (IOException ioe)
            {
                Console.WriteLine("IO Exception:{0}", ioe.Message);
            }

            catch (SocketException se)
            {
                Console.WriteLine("Socket Exception:{0}", se.Message);
            }

            catch (BEncodingException bee)
            {
                Console.WriteLine("BEncoding Exception:{0}", bee.Message);
            }

            finally
            {
                monitor.Unregister(handler);
                handler.Close();
            }
        }
Exemple #22
0
    // Adds a word into the data structure.
    public void AddWord(String word)
    {
        DictNode node = root;

        foreach (var c in word)
        {
            int index = c - 'a';
            if (node.children[index] == null)
            {
                node.children[index] = new DictNode();
            }
            node = node.children[index];
        }
        node.isWord = true;
    }
Exemple #23
0
        /// <summary>
        /// 生成存储过程发送的字节流
        /// </summary>
        /// <returns>返回发送的字节流</returns>
        private byte[] BuildProcMessage(DictNode contentNode)
        {
            contentNode.Add("text", commandText);

            //建立参数列表
            if (parameters.Count != 0)
            {
                ListNode parmsNode = new ListNode();
                foreach (DbProxyParameter para in parameters)
                {
                    DictNode parmNode = new DictNode();
                    parmNode.Add("name", para.ParameterName);
                    parmNode.Add("type", (int)para.DbType);

                    switch (para.Direction)
                    {
                    case ParameterDirection.Input:
                        parmNode.Add("value", NodeEncoder.GetValueNode(para));
                        break;

                    case ParameterDirection.Output:
                        parmNode.Add("direction", OutputNum);
                        break;

                    case ParameterDirection.InputOutput:
                        parmNode.Add("direction", InputOutputNum);
                        parmNode.Add("value", NodeEncoder.GetValueNode(para));
                        break;

                    case ParameterDirection.ReturnValue:
                        parmNode.Add("direction", ReturnValueNum);
                        break;
                    }


                    if (para.Size != 0)
                    {
                        parmNode.Add("size", para.Size);
                    }

                    parmsNode.Add(parmNode);
                }

                contentNode.Add("parms", parmsNode);
            }

            return(BEncode.ByteArrayEncode(contentNode));
        }
Exemple #24
0
            private void LookupTolerantImpl(DictNode cur, MatchCandidate mc)
            {
                if (cur.Children == null)
                {
                    return;
                }

                //System.Diagnostics.Trace.WriteLine("--------------------------");
                //System.Diagnostics.Trace.WriteLine(string.Format("Processing children for word {0}", mc.Word));
                for (byte childPos = 0; childPos < cur.Children.Length; childPos++)
                {
                    DictNode child = cur.Children[childPos];
                    DoKeyMatching(child, 0, mc);
                }
                //System.Diagnostics.Trace.WriteLine(string.Format("Completed processing node children for word {0}", mc.Word));
                //System.Diagnostics.Trace.WriteLine("--------------------------");
            }
Exemple #25
0
        /// <summary>
        /// Simple, efficient method for exact lookup in the radix
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        private DictNode LookupImpl(char[] key)
        {
            byte keyPos = 0, n;
            int  keyLength = GetCharArrayLength(key);

            DictNode cur = m_root;

            while (cur != null && cur.Children != null)
            {
                for (byte childPos = 0; ; childPos++)
                {
                    DictNode child = cur.Children[childPos];

                    // Do key matching
                    n = 0;
                    while (n < child.Key.Length && keyPos < keyLength && child.Key[n] == key[keyPos])
                    {
                        keyPos++;
                        n++;
                    }

                    if (n == child.Key.Length) // We consumed the child's key, and so far it matches our key
                    {
                        // We consumed both the child's key and the requested key, meaning we found the requested node
                        if (keyLength == keyPos)
                        {
                            return(child);
                        }
                        // We consumed this child's key, but the key we are looking for isn't over yet
                        else if (keyLength > keyPos)
                        {
                            cur = child;
                            break;
                        }
                    }
                    else if (n > 0 || // Incomplete match to child's key (worths nothing)
                             childPos + 1 == cur.Children.Length // We looked at all the node's children
                             )
                    {
                        return(null);
                    }
                }
            }

            return(null);
        }
Exemple #26
0
        /// <summary>
        /// Get the list of peers
        /// </summary>
        /// <param name="node">The response node that received from tracker</param>
        /// <returns>Return the list of peers</returns>
        private List <Peer> GetPeers(DictNode node)
        {
            List <Peer> peers = new List <Peer>();

            BEncodedNode peersNode = node["peers"];

            if (peersNode is BytesNode)
            {
                var peersBytes = ((BytesNode)peersNode).ByteArray;
                for (int i = 0; i < peersBytes.Length; i += 6)
                {
                    string host = string.Format("{0}.{1}.{2}.{3}", peersBytes[i], peersBytes[i + 1], peersBytes[i + 2],
                                                peersBytes[i + 3]);
                    int  port = (peersBytes[i + 4] << 8) + peersBytes[i + 5];
                    Peer peer = new Peer
                    {
                        Host = host,
                        Port = port,
                    };
                    peers.Add(peer);
                }
            }

            else if (peersNode is ListNode)
            {
                var listNode = peersNode as ListNode;
                for (int i = 0; i < listNode.Count; i++)
                {
                    DictNode dictNode = listNode[i] as DictNode;
                    string   peerId   = ((BytesNode)dictNode["peer id"]).StringText;
                    string   ip       = ((BytesNode)dictNode["ip"]).StringText;
                    int      port     = ((IntNode)dictNode["port"]).IntValue;
                    Peer     peer     = new Peer
                    {
                        Host = ip,
                        Port = port
                    };
                    peers.Add(peer);
                }
            }

            return(peers);
        }
Exemple #27
0
        /// <summary>
        /// 创建存储过程的命令
        /// </summary>
        /// <param name="node">待解析的节点</param>
        /// <returns>返回存储过程的命令</returns>
        internal static DbCommand CreateProcCommand(DictNode node)
        {
            DbCommand result  = new SqlCommand();
            string    cmdText = ((BytesNode)node["text"]).StringText;

            result.CommandText = cmdText;
            result.CommandType = CommandType.StoredProcedure;

            if (node.ContainsKey("parms"))
            {
                ListNode parmsNode = ((ListNode)node["parms"]);

                foreach (BEncodedNode parmNode in parmsNode)
                {
                    DictNode dictNode = (DictNode)parmNode;
                    result.Parameters.Add(CreateParm(dictNode));
                }
            }
            return(result);
        }
Exemple #28
0
        /// <summary>
        /// 检验打开数据包
        /// </summary>
        /// <param name="packet">打开数据包</param>
        /// <returns>如果打开成功,返回ture,否则返回false</returns>
        private bool CheckOpenPacket(byte[] packet)
        {
            DictNode openPacket = (DictNode)BEncode.Decode(packet);
            int      code       = ((IntNode)openPacket["code"]).Value;

            switch (code)
            {
            case 1:
                byte[] key = ((BytesNode)openPacket["key"]).ByteArray;
                byte[] iv  = ((BytesNode)openPacket["iv"]).ByteArray;
                handler.SetKeyIV(key, iv);
                return(true);

            case 6:
                string messag = ((BytesNode)openPacket["message"]).StringText;
                throw new DbProxyException(messag);

            default:
                throw new DbProxyException("错误的消息代码");
            }
        }
Exemple #29
0
        public void TestEncodeHandler1()
        {
            FileStream sourceFile = File.OpenRead(@"E:\Bittorrent\Torrents\winedt70.exe.torrent");

            byte[] source = new byte[sourceFile.Length];
            sourceFile.Read(source, 0, (int)sourceFile.Length);
            sourceFile.Close();
            DictNode dh = (DictNode)BEncodingFactory.Decode(source);

            byte[]     destion    = BEncodingFactory.ByteArrayEncode(dh);
            FileStream targetFile = File.OpenWrite(@"E:\Bittorrent\Torrents\test.torrent");

            targetFile.Write(destion, 0, destion.Length);

            int i;

            for (i = 0; i < source.Length; i++)
            {
                Assert.AreEqual(source[i], destion[i]);
            }

            targetFile.Close();
        }
Exemple #30
0
 /// <summary>
 /// 检验打开数据包
 /// </summary>
 /// <param name="packet">打开数据包</param>
 /// <param name="key">密钥</param>
 /// <param name="iv">初始化向量</param>
 /// <param name="error">错误信息</param>
 /// <returns>如果打开成功,返回ture,否则返回false</returns>
 private bool CheckOpenPacket(byte[] packet, out byte[] key, out byte[] iv, out string error)
 {
     key   = null;
     iv    = null;
     port  = -1;
     error = string.Empty;
     try
     {
         DictNode node = (DictNode)BEncode.Decode(packet);
         if (node.ContainsKey("key") && node.ContainsKey("iv"))
         {
             key = ((BytesNode)node["key"]).ByteArray;
             iv  = ((BytesNode)node["iv"]).ByteArray;
             return(true);
         }
         error = "数据包不包含密钥或者初始化向量或者端口信息!";
     }
     catch (BEncodingException bee)
     {
         error = bee.Message;
     }
     return(false);
 }