コード例 #1
0
ファイル: Bencoding.cs プロジェクト: tomatobot/bencode
 public static string EncodeString(IBencodingType bencode)
 {
     MemoryStream ms = new MemoryStream();
     Encode(bencode, ms);
     ms.Position = 0;
     return new StreamReader(ms, BEncoding).ReadToEnd();
 }
コード例 #2
0
ファイル: Bencoding.cs プロジェクト: tomatobot/bencode
 public static byte[] EncodeBytes(IBencodingType bencode)
 {
     MemoryStream ms = new MemoryStream();
     Encode(bencode, ms);
     ms.Position = 0;
     return new BinaryReader(ms, BEncoding).ReadBytes((int)ms.Length);
 }
コード例 #3
0
        /// <summary>
        /// Encode the given object to a stream.
        /// </summary>
        /// <param name="bencode">The object to encode.</param>
        /// <param name="output">The stream to write to.</param>
        public static void Encode(IBencodingType bencode, Stream output)
        {
            BinaryWriter writer = new BinaryWriter(output, ExtendedASCIIEncoding);

            bencode.Encode(writer);

            writer.Flush();
        }
コード例 #4
0
        /// <summary>
        /// Encode the given object to a series of bytes.
        /// </summary>
        /// <param name="bencode">The bencode object to encode.</param>
        /// <returns>A bencoded string of the object in Extended ASCII Encoding.</returns>
        public static byte[] EncodeBytes(IBencodingType bencode)
        {
            MemoryStream ms = new MemoryStream();

            Encode(bencode, ms);
            ms.Position = 0;

            return(new BinaryReader(ms, ExtendedASCIIEncoding).ReadBytes((int)ms.Length));
        }
コード例 #5
0
        /// <summary>
        /// Encode the given object to a string.
        /// Warning: Beware of encodings, take special care when using it further.
        /// </summary>
        /// <seealso cref="ExtendedASCIIEncoding"/>
        /// <param name="bencode">The bencode object to encode.</param>
        /// <returns>A bencoded string with the object.</returns>
        public static string EncodeString(IBencodingType bencode)
        {
            MemoryStream ms = new MemoryStream();

            Encode(bencode, ms);
            ms.Position = 0;

            return(new StreamReader(ms, ExtendedASCIIEncoding).ReadToEnd());
        }
コード例 #6
0
        public static IBencodingType Decode(BinaryReader inputStream, ref int bytesConsumed)
        {
            IBencodingType returnValue = null;

            char next = (char)inputStream.PeekChar();

            switch (next)
            {
            case 'i':
                // Integer
                returnValue = new BInt(0);
                break;

            case 'l':
                // List
                returnValue = new BList();
                break;

            case 'd':
                // Dictionary
                returnValue = new BDict();
                break;

            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                // String
                returnValue = new BString();
                break;
            }

            return(returnValue.Decode(inputStream, ref bytesConsumed));
        }
コード例 #7
0
        /// <summary>
        /// Encode the given object to a stream.
        /// </summary>
        /// <param name="bencode">The object to encode.</param>
        /// <param name="output">The stream to write to.</param>
        public static void Encode(IBencodingType bencode, Stream output)
        {
            BinaryWriter writer = new BinaryWriter(output, ExtendedASCIIEncoding);

            bencode.Encode(writer);

            writer.Flush();
        }
コード例 #8
0
        /// <summary>
        /// Background thread handling all incoming traffic
        /// </summary>
        private void ReceivePackets()
        {
            while (true)
            {
                try
                {
                    // Get a datagram
                    receiveFrom = new IPEndPoint(IPAddress.Any, localPort);
                    byte[] data = udpClient.Receive(ref receiveFrom);

                    // Decode the message
                    Stream         stream      = new MemoryStream(data);
                    IBencodingType receivedMsg = BencodingUtils.Decode(stream);
                    string         decoded     = BencodingUtils.ExtendedASCIIEncoding.GetString(data.ToArray());
                    Log("Received message!");
                    //Log(decoded);

                    // t is transaction id : todo: check, since ports are reused
                    // y is e for error, r for reply, q for query
                    if (receivedMsg is BDict) // throws error.. todo: fix
                    {
                        BDict dictMsg = (BDict)receivedMsg;
                        if (dictMsg.ContainsKey("y"))
                        {
                            if (dictMsg["y"].Equals(new BString("e")))
                            {
                                // received error
                                Log("Received error! (ignored)");
                            }
                            else if (dictMsg["y"].Equals(new BString("r")))
                            {
                                // received reply
                                if (dictMsg.ContainsKey("r"))
                                {
                                    if (dictMsg["r"] is BDict)
                                    {
                                        BDict dictMsg2 = (BDict)dictMsg["r"];
                                        if (dictMsg2.ContainsKey("values") && dictMsg.ContainsKey("t"))
                                        {
                                            Log("Received list of peers for torrent!");
                                            countRecvPeerPackets++;
                                            BList peerAdrs = (BList)dictMsg2["values"];
                                            UpdateTorrentPeerList(peerAdrs, (BString)dictMsg["t"]);
                                        }
                                        else if (dictMsg2.ContainsKey("nodes") && dictMsg.ContainsKey("t"))
                                        {
                                            // could be an answer to find node or get peers
                                            Log("Received list of nodeID & IP & port!");
                                            countRecvNodePackets++;
                                            BString nodeIDString = (BString)dictMsg2["nodes"];
                                            UpdateContactList(nodeIDString, (BString)dictMsg["t"]);
                                        }
                                        else
                                        {
                                        }
                                    }
                                    else
                                    {
                                    }
                                }
                            }
                            else if (dictMsg["y"].Equals(new BString("q")))
                            {
                                // received query
                                Log("Received query! (ignored)");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log("Error receiving data: " + ex.ToString());
                }
            }
        }
コード例 #9
0
        /// <summary>
        /// Background thread handling all incoming traffic
        /// </summary>
        private void ReceivePackets()
        {
            while (true)
            {
                try
                {
                    // Get a datagram
                    receiveFrom = new IPEndPoint(IPAddress.Any, localPort);
                    // Stopwatch sw = new Stopwatch();
                    // sw.Start();
                    byte[] data = udpClientReceive.Receive(ref receiveFrom);
                    //if (sw.ElapsedMilliseconds > 10) { Console.WriteLine(sw.ElapsedMilliseconds); }
                    //sw.Stop();

                    // Decode the message
                    Stream         stream      = new MemoryStream(data);
                    IBencodingType receivedMsg = BencodingUtils.Decode(stream);
                    string         decoded     = BencodingUtils.ExtendedASCIIEncoding.GetString(data.ToArray());
                    //Log("Received message!");

                    // t is transaction id
                    // y is e for error, r for reply, q for query
                    if (receivedMsg is BDict) // throws error.. todo: fix
                    {
                        BDict dictMsg = (BDict)receivedMsg;
                        if (dictMsg.ContainsKey("y"))
                        {
                            if (dictMsg["y"].Equals(new BString("e")))
                            {
                                //Log("Received error! (ignored)");
                            }
                            else if (dictMsg["y"].Equals(new BString("r")))
                            {
                                // received reply
                                if (dictMsg.ContainsKey("r"))
                                {
                                    if (dictMsg["r"] is BDict)
                                    {
                                        BDict dictMsg2 = (BDict)dictMsg["r"];
                                        if (dictMsg2.ContainsKey("values"))
                                        {
                                            //Log("Received list of peers for torrent!");
                                            countRecvPeerPackets++;
                                        }
                                        else if (dictMsg2.ContainsKey("nodes"))
                                        {
                                            // could be an answer to find node or get peers
                                            //Log("Received list of nodeID & IP & port!");
                                            countRecvNodePackets++;
                                            BString nodeIDString = (BString)dictMsg2["nodes"];
                                            UpdateContactList(nodeIDString);
                                        }
                                        else
                                        {
                                            // no values and no nodes, assuming its a ping,
                                            // at least some form of response
                                        }
                                    }
                                    else
                                    {
                                    }
                                }
                            }
                            else if (dictMsg["y"].Equals(new BString("q")))
                            {
                                // received query
                                countRecvQuery++;
                                //Log("Received query! (ignored)");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    //Log("Error receiving data: " + ex.ToString());
                }
            }
        }
コード例 #10
0
        public bool Load(Stream stream)
        {
            _root = BencodingUtils.Decode(stream);
            if (_root == null)
            {
                return(false);
            }

            BDict dictRoot = (_root as BDict);

            if (dictRoot == null)
            {
                return(false);
            }

            if (dictRoot.ContainsKey("announce"))
            {
                Announce = (BString)dictRoot["announce"];
            }

            if (dictRoot.ContainsKey("announce-list"))
            {
                BList announceList = (BList)dictRoot["announce-list"];
                foreach (IBencodingType type in announceList)
                {
                    if (type is BString)
                    {
                        AnnounceList.Add(type as BString);
                    }
                    else
                    {
                        BList list = type as BList;
                        if (list == null)
                        {
                            continue;
                        }

                        BList listType = list;
                        foreach (IBencodingType bencodingType in listType)
                        {
                            BString s = (BString)bencodingType;
                            AnnounceList.Add(s);
                        }
                    }
                }
            }

            if (dictRoot.ContainsKey("comment"))
            {
                Comment = (BString)dictRoot["comment"];
            }

            if (dictRoot.ContainsKey("created by"))
            {
                CreatedBy = (BString)dictRoot["created by"];
            }

            if (dictRoot.ContainsKey("creation date"))
            {
                long ts = (BInt)dictRoot["creation date"];
                CreationDate = new DateTime(1970, 1, 1).AddSeconds(ts);
            }

            if (dictRoot.ContainsKey("info"))
            {
                BDict infoDict = (BDict)dictRoot["info"];

                using (SHA1Managed sha1 = new SHA1Managed())
                {
                    byte[] str = BencodingUtils.EncodeBytes(infoDict);
                    Hash = sha1.ComputeHash(str);
                }

                if (infoDict.ContainsKey("files"))
                {
                    //multi file mode
                    BList fileList = (BList)infoDict["files"];
                    foreach (IBencodingType bencodingType in fileList)
                    {
                        BDict fileDict = (BDict)bencodingType;

                        String filename = string.Empty;
                        Int64  filesize = default(Int64);

                        if (fileDict.ContainsKey("path"))
                        {
                            BList filenameList = (BList)fileDict["path"];
                            foreach (IBencodingType type in filenameList)
                            {
                                filename += (BString)type;
                                filename += "\\";
                            }
                            filename = filename.Trim('\\');
                        }

                        if (fileDict.ContainsKey("length"))
                        {
                            filesize = (BInt)fileDict["length"];
                        }

                        Files.Add(filename, filesize);
                    }
                }

                if (infoDict.ContainsKey("name"))
                {
                    Name = (BString)infoDict["name"];
                    if (Files.Count == 0 && infoDict.ContainsKey("length"))
                    {
                        Files.Add(Name, (BInt)infoDict["length"]);
                    }
                }

                if (infoDict.ContainsKey("private"))
                {
                    BInt isPrivate = (BInt)infoDict["private"];
                    Private = isPrivate != 0;
                }

                if (infoDict.ContainsKey("pieces"))
                {
                    BString pieces = (BString)infoDict["pieces"];
                    for (int x = 0; x < pieces.ByteValue.Length; x += 20)
                    {
                        byte[] hash = pieces.ByteValue.GetBytes(x, 20);
                        PieceHashes.Add(hash);
                    }
                }

                if (infoDict.ContainsKey("piece length"))
                {
                    PieceSize = (BInt)infoDict["piece length"];
                }
            }

            return(true);
        }
コード例 #11
0
        public bool Load(Stream stream)
        {
            _root = BencodingUtils.Decode(stream);
            if (_root == null) return false;

            BDict dictRoot = (_root as BDict);
            if (dictRoot == null) return false;

            if (dictRoot.ContainsKey("announce"))
            {
                Announce = (BString)dictRoot["announce"];
            }

            if (dictRoot.ContainsKey("announce-list"))
            {
                BList announceList = (BList)dictRoot["announce-list"];
                foreach (IBencodingType type in announceList)
                {
                    if (type is BString)
                    {
                        AnnounceList.Add(type as BString);
                    }
                    else
                    {
                        BList list = type as BList;
                        if (list == null) continue;

                        BList listType = list;
                        foreach (IBencodingType bencodingType in listType)
                        {
                            BString s = (BString)bencodingType;
                            AnnounceList.Add(s);
                        }
                    }
                }
            }

            if (dictRoot.ContainsKey("comment"))
            {
                Comment = (BString)dictRoot["comment"];
            }

            if (dictRoot.ContainsKey("created by"))
            {
                CreatedBy = (BString)dictRoot["created by"];
            }

            if (dictRoot.ContainsKey("creation date"))
            {
                long ts = (BInt)dictRoot["creation date"];
                CreationDate = new DateTime(1970, 1, 1).AddSeconds(ts);
            }

            if (dictRoot.ContainsKey("info"))
            {
                BDict infoDict = (BDict)dictRoot["info"];

                using (SHA1Managed sha1 = new SHA1Managed())
                {
                    byte[] str = BencodingUtils.EncodeBytes(infoDict);
                    Hash = sha1.ComputeHash(str);
                }                

                if (infoDict.ContainsKey("files"))
                {
                    //multi file mode
                    BList fileList = (BList)infoDict["files"];
                    foreach (IBencodingType bencodingType in fileList)
                    {
                        BDict fileDict = (BDict)bencodingType;
                        
                        String filename = string.Empty;
                        Int64 filesize = default(Int64);

                        if (fileDict.ContainsKey("path"))
                        {
                            BList filenameList = (BList)fileDict["path"];
                            foreach (IBencodingType type in filenameList)
                            {
                                filename += (BString)type;
                                filename += "\\";
                            }
                            filename = filename.Trim('\\');
                        }

                        if (fileDict.ContainsKey("length"))
                        {
                            filesize = (BInt)fileDict["length"];
                        }

                        Files.Add(filename, filesize);
                    }
                }

                if (infoDict.ContainsKey("name"))
                {
                    Name = (BString)infoDict["name"];
                    if (Files.Count == 0 && infoDict.ContainsKey("length"))
                    {
                        Files.Add(Name, (BInt)infoDict["length"]);
                    }
                }

                if (infoDict.ContainsKey("private"))
                {
                    BInt isPrivate = (BInt)infoDict["private"];
                    Private = isPrivate != 0;
                }

                if (infoDict.ContainsKey("pieces"))
                {
                    BString pieces = (BString)infoDict["pieces"];
                    for (int x = 0; x < pieces.ByteValue.Length; x += 20)
                    {
                        byte[] hash = pieces.ByteValue.GetBytes(x, 20);
                        PieceHashes.Add(hash);
                    }
                }

                if (infoDict.ContainsKey("piece length"))
                {
                    PieceSize = (BInt)infoDict["piece length"];
                }
            }

            return true;
        }
コード例 #12
0
        public bool Load(Stream stream)
        {
            _root = BencodingUtils.Decode(stream);
            if (_root == null)
            {
                return(false);
            }

            var dictRoot = (_root as BDict);

            if (dictRoot == null)
            {
                return(false);
            }

            if (dictRoot.ContainsKey(ANNOUNCE_KEY))
            {
                Announce = (BString)dictRoot[ANNOUNCE_KEY];
            }

            if (dictRoot.ContainsKey(ANNOUNCE_LIST_KEY))
            {
                var announceList = (BList)dictRoot[ANNOUNCE_LIST_KEY];
                foreach (IBencodingType type in announceList)
                {
                    if (type is BString)
                    {
                        AnnounceList.Add(type as BString);
                    }
                    else
                    {
                        var list = type as BList;
                        if (list == null)
                        {
                            continue;
                        }

                        var listType = list;
                        foreach (IBencodingType bencodingType in listType)
                        {
                            var s = (BString)bencodingType;
                            AnnounceList.Add(s);
                        }
                    }
                }
            }

            if (dictRoot.ContainsKey(COMMENT_KEY))
            {
                Comment = (BString)dictRoot[COMMENT_KEY];
            }

            if (dictRoot.ContainsKey(CREATED_BY_KEY))
            {
                CreatedBy = (BString)dictRoot[CREATED_BY_KEY];
            }

            if (dictRoot.ContainsKey(CREATION_DATE_KEY))
            {
                long ts = (BInt)dictRoot[CREATION_DATE_KEY];
                CreationDate = new DateTime(1970, 1, 1).AddSeconds(ts);
            }

            if (dictRoot.ContainsKey(INFO_KEY))
            {
                var infoDict = (BDict)dictRoot[INFO_KEY];

                using (SHA1Managed sha1 = new SHA1Managed())
                {
                    var str = BencodingUtils.EncodeBytes(infoDict);
                    Hash = sha1.ComputeHash(str);
                }

                if (infoDict.ContainsKey(FILES_KEY))
                {
                    //multi file mode
                    var fileList = (BList)infoDict[FILES_KEY];
                    foreach (IBencodingType bencodingType in fileList)
                    {
                        var fileDict = (BDict)bencodingType;

                        var filename = string.Empty;
                        var filesize = default(Int64);

                        if (fileDict.ContainsKey(PATH_KEY))
                        {
                            var filenameList = (BList)fileDict[PATH_KEY];
                            foreach (IBencodingType type in filenameList)
                            {
                                filename += (BString)type;
                                filename += "\\";
                            }
                            filename = filename.Trim('\\');
                        }

                        if (fileDict.ContainsKey(LENGTH_KEY))
                        {
                            filesize = (BInt)fileDict[LENGTH_KEY];
                        }

                        Files.Add(filename, filesize);
                    }
                }

                if (infoDict.ContainsKey(NAME_KEY))
                {
                    Name = (BString)infoDict[NAME_KEY];
                    if (Files.Count == 0 && infoDict.ContainsKey(LENGTH_KEY))
                    {
                        Files.Add(Name, (BInt)infoDict[LENGTH_KEY]);
                    }
                }

                if (infoDict.ContainsKey(PRIVATE_KEY))
                {
                    var isPrivate = (BInt)infoDict[PRIVATE_KEY];
                    Private = isPrivate != 0;
                }

                if (infoDict.ContainsKey(PIECES_KEY))
                {
                    var pieces = (BString)infoDict[PIECES_KEY];
                    for (var x = 0; x < pieces.ByteValue.Length; x += 20)
                    {
                        var hash = pieces.ByteValue.GetBytes(x, 20);
                        PieceHashes.Add(hash);
                    }
                }

                if (infoDict.ContainsKey(PIECE_LENGTH_KEY))
                {
                    PieceSize = (BInt)infoDict[PIECE_LENGTH_KEY];
                }
            }

            return(true);
        }