public static UdpTrackerMessage DecodeMessage(byte[] buffer, int offset, int count, MessageType type) { UdpTrackerMessage m = null; int action = type == MessageType.Request ? ReadInt(buffer, offset + 8) : ReadInt(buffer, offset); switch (action) { case 0: if (type == MessageType.Request) { m = new ConnectMessage(); } else { m = new ConnectResponseMessage(); } break; case 1: if (type == MessageType.Request) { m = new AnnounceMessage(); } else { m = new AnnounceResponseMessage(); } break; case 2: if (type == MessageType.Request) { m = new ScrapeMessage(); } else { m = new ScrapeResponseMessage(); } break; case 3: m = new ErrorMessage(); break; default: throw new ProtocolException(string.Format("Invalid udp message received: {0}", buffer[offset])); } try { m.Decode(buffer, offset, count); } catch { m = new ErrorMessage(0, "Couldn't decode the tracker response"); } return(m); }
public static UdpTrackerMessage DecodeMessage(byte[] buffer, int offset, int count, MessageType type) { UdpTrackerMessage m = null; int action = type == MessageType.Request ? ReadInt(buffer, offset + 8) : ReadInt(buffer, offset); switch (action) { case 0: if (type == MessageType.Request) m = new ConnectMessage(); else m = new ConnectResponseMessage(); break; case 1: if (type == MessageType.Request) m = new AnnounceMessage(); else m = new AnnounceResponseMessage(); break; case 2: if (type == MessageType.Request) m = new ScrapeMessage(); else m = new ScrapeResponseMessage(); break; case 3: m = new ErrorMessage(); break; default: throw new ProtocolException(string.Format("Invalid udp message received: {0}", buffer[offset])); } try { m.Decode(buffer, offset, count); } catch { m = new ErrorMessage(0, "Couldn't decode the tracker response"); } return m; }
private NameValueCollection getCollection(ScrapeMessage scrapeMessage) { var res = new NameValueCollection(); if (scrapeMessage.InfoHashes.Count == 0) return res; //no infohash???? //TODO more than one infohash : paid attention to order in response!!! var hash = new InfoHash(scrapeMessage.InfoHashes[0]); res.Add("info_hash", hash.UrlEncode()); return res; }
protected virtual void ReceiveScrape(ScrapeMessage scrapeMessage) { var val = Handle(getCollection(scrapeMessage), endpoint.Address, true); UdpTrackerMessage m; byte[] data; if (val.ContainsKey(RequestParameters.FailureKey)) { m = new ErrorMessage(scrapeMessage.TransactionId, val[RequestParameters.FailureKey].ToString()); } else { var scrapes = new List<ScrapeDetails>(); foreach (var keypair in val) { var dict = (BEncodedDictionary) keypair.Value; var seeds = 0; var leeches = 0; var complete = 0; foreach (var keypair2 in dict) { switch (keypair2.Key.Text) { case "complete": //The current number of connected seeds seeds = Convert.ToInt32(keypair2.Value.ToString()); break; case "downloaded": //The total number of completed downloads complete = Convert.ToInt32(keypair2.Value.ToString()); break; case "incomplete": leeches = Convert.ToInt32(keypair2.Value.ToString()); break; } } var sd = new ScrapeDetails(seeds, leeches, complete); scrapes.Add(sd); if (scrapes.Count == 74) //protocole do not support to send more than 74 scrape at once... { m = new ScrapeResponseMessage(scrapeMessage.TransactionId, scrapes); data = m.Encode(); listener.Send(data, data.Length, endpoint); scrapes.Clear(); } } m = new ScrapeResponseMessage(scrapeMessage.TransactionId, scrapes); } data = m.Encode(); listener.Send(data, data.Length, endpoint); }
public void ScrapeTest() { List<byte[]> hashes = new List<byte[]>(); hashes.Add(MonoTorrent.Dht.NodeId.Create().Bytes); hashes.Add(MonoTorrent.Dht.NodeId.Create().Bytes); hashes.Add(MonoTorrent.Dht.NodeId.Create().Bytes); ScrapeMessage m = new ScrapeMessage(12345, 123, hashes); ScrapeMessage d = (ScrapeMessage)UdpTrackerMessage.DecodeMessage(m.Encode(), 0, m.ByteLength, MessageType.Request); Check(m, MessageType.Request); Assert.AreEqual(2, m.Action); Assert.AreEqual(m.Action, d.Action); Assert.IsTrue(Toolbox.ByteMatch(m.Encode(), d.Encode())); }
protected override void ReceiveScrape(ScrapeMessage scrapeMessage) { if (!IgnoreScrapes) base.ReceiveScrape(scrapeMessage); }
public void ScrapeMessageTest() { List<byte[]> hashes = new List<byte[]>(); Random r = new Random(); byte[] hash1 = new byte[20]; byte[] hash2 = new byte[20]; byte[] hash3 = new byte[20]; r.NextBytes(hash1); r.NextBytes(hash2); r.NextBytes(hash3); hashes.Add(hash1); hashes.Add(hash2); hashes.Add(hash3); ScrapeMessage m = new ScrapeMessage(12345, 123, hashes); ScrapeMessage d = (ScrapeMessage)UdpTrackerMessage.DecodeMessage(m.Encode(), 0, m.ByteLength, MessageType.Request); Check(m, MessageType.Request); Assert.AreEqual(2, m.Action); Assert.AreEqual(m.Action, d.Action); Assert.IsTrue(Toolbox.ByteMatch(m.Encode(), d.Encode())); }