public void AnnounceResponseTest() { var peers = new List<Peer> { new Peer(new string('1', 20), new Uri("tcp://127.0.0.1:1")), new Peer(new string('2', 20), new Uri("tcp://127.0.0.1:2")), new Peer(new string('3', 20), new Uri("tcp://127.0.0.1:3")) }; var m = new AnnounceResponseMessage(12345, TimeSpan.FromSeconds(10), 43, 65, peers); var d = (AnnounceResponseMessage) UdpTrackerMessage.DecodeMessage(m.Encode(), 0, m.ByteLength, MessageType.Response); Check(m, MessageType.Response); Assert.AreEqual(1, m.Action); Assert.AreEqual(m.Action, d.Action); Assert.IsTrue(Toolbox.ByteMatch(m.Encode(), d.Encode())); Assert.AreEqual(12345, d.TransactionId); }
//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); }