public static string EncodeString(IBencodingType bencode) { MemoryStream ms = new MemoryStream(); Encode(bencode, ms); ms.Position = 0; return new StreamReader(ms, BEncoding).ReadToEnd(); }
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); }
/// <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(); }
/// <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)); }
/// <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()); }
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)); }
/// <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()); } } }
/// <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()); } } }
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); }
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; }
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); }