internal ClientAnnounceResponseMessage(AnnounceResponse response, TrustZoneSharedKey trustZoneSharedKey) : base() { Response = response; TrustZoneSharedKey = trustZoneSharedKey; }
public void ReceivedData(UdpReceiveResult res, UdpClient client) { var receivedData = res.Buffer; var endPointAddress = res.RemoteEndPoint.Address; var addressString = endPointAddress.ToString(); if (receivedData.Length > 12) { var action = Unpack.UInt32(receivedData, 8); //connect,announce,scrape switch (action) { case 0: var connectRequest = new ConnectRequest(receivedData); Console.WriteLine("[Connect] from " + addressString + ":" + res.RemoteEndPoint.Port); var connectResponse = new ConnectResponse(0, connectRequest.TransactionID, (long)13376969); SendDataAsync(client, connectResponse.Data, res.RemoteEndPoint); break; case 1: var announceRequest = new AnnounceRequest(receivedData); Console.WriteLine("[Announce] from " + addressString + ":" + announceRequest.Port + ", " + (TorrentEvent)announceRequest.TorrentEvent); var peer = new TorrentPeer(addressString, announceRequest.Port); if ((TorrentEvent)announceRequest.TorrentEvent != TorrentEvent.Stopped) { RedisBacking.AddPeer(peer, announceRequest.InfoHash); } else { RedisBacking.RemovePeer(peer, announceRequest.InfoHash); } var peers = RedisBacking.GetPeers(announceRequest.InfoHash); var torrentInfo = RedisBacking.ScrapeHashes(new List <byte[]>() { announceRequest.InfoHash }); var announceResponse = new AnnounceResponse(announceRequest.TransactionID, AnnounceInterval, torrentInfo.First().Leechers, torrentInfo.First().Seeders, peers); SendDataAsync(client, announceResponse.Data, res.RemoteEndPoint); break; case 2: var scrapeRequest = new ScrapeRequest(receivedData); Console.WriteLine(string.Format("[Scrape] from {0} for {1} torrents", addressString, scrapeRequest.InfoHashes.Count)); var scrapedTorrents = RedisBacking.ScrapeHashes(scrapeRequest.InfoHashes); var scrapeResponse = new ScrapeResponse(scrapeRequest.TransactionID, scrapedTorrents); SendDataAsync(client, scrapeResponse.Data, res.RemoteEndPoint); break; default: Console.WriteLine(Encoding.UTF8.GetString(receivedData)); break; } } else { Console.WriteLine(Encoding.UTF8.GetString(receivedData)); } }