public void AnnounceMessageTest() { var m = new AnnounceMessage(0, 12345, _announceParams); var d = (AnnounceMessage) UdpTrackerMessage.DecodeMessage(m.Encode(), 0, m.ByteLength, MessageType.Request); Check(m, MessageType.Request); Assert.AreEqual(1, m.Action); Assert.AreEqual(m.Action, d.Action); Assert.IsTrue(Toolbox.ByteMatch(m.Encode(), d.Encode())); Assert.AreEqual(12345, d.ConnectionId); }
private NameValueCollection getCollection(AnnounceMessage announceMessage) { NameValueCollection res = new NameValueCollection(); res.Add("info_hash", announceMessage.Infohash.UrlEncode()); res.Add("peer_id", announceMessage.PeerId); res.Add("port", announceMessage.Port.ToString()); res.Add("uploaded", announceMessage.Uploaded.ToString()); res.Add("downloaded", announceMessage.Downloaded.ToString()); res.Add("left", announceMessage.Left.ToString()); res.Add("compact", "1");//hardcode res.Add("numwant", announceMessage.NumWanted.ToString()); res.Add("ip", announceMessage.Ip.ToString()); res.Add("key", announceMessage.Key.ToString()); res.Add("event", announceMessage.TorrentEvent.ToString().ToLower()); return res; }
protected override void ReceiveAnnounce(AnnounceMessage announceMessage) { if (!IgnoreAnnounces) base.ReceiveAnnounce(announceMessage); }
//QUICKHACK: format bencoded val and get it back wereas must refactor tracker system to have more generic object... protected virtual void ReceiveAnnounce(AnnounceMessage announceMessage) { UdpTrackerMessage m; BEncodedDictionary dict = Handle(getCollection(announceMessage), endpoint.Address, false); if (dict.ContainsKey(RequestParameters.FailureKey)) { m = new ErrorMessage(announceMessage.TransactionId, dict[RequestParameters.FailureKey].ToString()); } else { TimeSpan interval = TimeSpan.Zero; int leechers = 0; int seeders = 0; var peers = new List<Client.Peer>(); foreach (var keypair in dict) { switch (keypair.Key.Text) { case ("complete"): seeders = Convert.ToInt32(keypair.Value.ToString());//same as seeder? break; case ("incomplete"): leechers = Convert.ToInt32(keypair.Value.ToString());//same as leecher? break; case ("interval"): interval = TimeSpan.FromSeconds(int.Parse(keypair.Value.ToString())); break; case ("peers"): if (keypair.Value is BEncodedList) // Non-compact response peers.AddRange(Client.Peer.Decode((BEncodedList)keypair.Value)); else if (keypair.Value is BEncodedString) // Compact response peers.AddRange(Client.Peer.Decode((BEncodedString)keypair.Value)); break; } } m = new AnnounceResponseMessage(announceMessage.TransactionId, interval, leechers, seeders, peers); } byte[] data = m.Encode(); listener.Send(data, data.Length, endpoint); }