Esempio n. 1
0
        async void ReceiveAsync(UdpClient client, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                try {
                    var result = await client.ReceiveAsync().ConfigureAwait(false);

                    var receiveString = Encoding.ASCII.GetString(result.Buffer);

                    var match = RegexMatcher.Match(receiveString);
                    if (!match.Success)
                    {
                        return;
                    }

                    int portcheck = Convert.ToInt32(match.Groups["port"].Value);
                    if (portcheck <= 0 || portcheck > 65535)
                    {
                        return;
                    }

                    var infoHash = InfoHash.FromHex(match.Groups["hash"].Value);
                    var uri      = new Uri("ipv4://" + result.RemoteEndPoint.Address + ':' + portcheck);

                    PeerFound?.Invoke(this, new LocalPeerFoundEventArgs(infoHash, uri));
                } catch {
                }
            }
        }
Esempio n. 2
0
        public CustomTrackable(string pName, string pInfoHash)
        {
            name = pName;
            var hash = InfoHash.FromHex(pInfoHash.Replace("-", ""));

            infoHash = hash;
        }
Esempio n. 3
0
        public override async void OnNavigatedTo(object parameter, NavigationMode mode, Dictionary <string, object> state)
        {
            if (mode == NavigationMode.Back)
            {
                _navigationService.GoBack();
                return;
            }

            PlaybackTorrent = (PlaybackTorrent)parameter;
            if (!string.IsNullOrEmpty(PlaybackTorrent.TorrentUrl))
            {
                State = TorrentStreamManager.State.Metadata;
                var torrent = await Torrent.LoadAsync(new Uri(PlaybackTorrent.TorrentUrl), "");

                _torrentStreamService.CreateManager(torrent);
            }
            else if (!string.IsNullOrEmpty(PlaybackTorrent.MagnetLink))
            {
                var magnetLink = new MagnetLink(PlaybackTorrent.MagnetLink);
                _torrentStreamService.CreateManager(magnetLink);
            }
            else
            {
                var hash = InfoHash.FromHex(PlaybackTorrent.TorrentHash);
                _torrentStreamService.CreateManager(hash);
            }
            _torrentStreamService.StreamManager.StreamProgress += StreamManagerOnStreamProgress;
            _torrentStreamService.StreamManager.StreamReady    += StreamManagerOnStreamReady;
            _torrentStreamService.StreamManager.Error          += StreamManagerOnError;
            _torrentStreamService.StreamManager.StartDownload();
            State = _torrentStreamService.StreamManager.CurrentState;
        }
Esempio n. 4
0
        private void DatagramSocketOnMessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
        {
            try
            {
                var dataReader   = args.GetDataReader();
                var receiveBytes = new byte[dataReader.UnconsumedBufferLength];
                dataReader.ReadBytes(receiveBytes);
                var receiveString = Encoding.ASCII.GetString(receiveBytes);
                var exp           = new Regex(
                    "BT-SEARCH \\* HTTP/1.1\\r\\nHost: 239.192.152.143:6771\\r\\nPort: (?<port>[^@]+)\\r\\nInfohash: (?<hash>[^@]+)\\r\\n\\r\\n\\r\\n");
                var match = exp.Match(receiveString);

                if (!match.Success)
                {
                    return;
                }

                var portcheck = Convert.ToInt32(match.Groups["port"].Value);
                if (portcheck < 0 || portcheck > 65535)
                {
                    return;
                }

                TorrentManager manager   = null;
                var            matchHash = InfoHash.FromHex(match.Groups["hash"].Value);
                for (var i = 0; manager == null && i < _engine.Torrents.Count; i++)
                {
                    if (_engine.Torrents[i].InfoHash == matchHash)
                    {
                        manager = _engine.Torrents[i];
                    }
                }

                if (manager == null)
                {
                    return;
                }

                var uri  = new Uri("tcp://" + args.RemoteAddress.RawName + ':' + match.Groups["port"].Value);
                var peer = new Peer("", uri, EncryptionTypes.All);

                // Add new peer to matched Torrent
                if (manager.HasMetadata && manager.Torrent.IsPrivate)
                {
                    return;
                }
                ClientEngine.MainLoop.Queue(delegate
                {
                    var count = manager.AddPeersCore(peer);
                    manager.RaisePeersFound(new LocalPeersAdded(manager, count, 1));
                });
            }
            catch
            {
                // ignored
            }
        }
Esempio n. 5
0
        private void OnReceiveCallBack(IAsyncResult asyncResult)
        {
            var udpClient = (UdpClient) asyncResult.AsyncState;
            var endPoint = new IPEndPoint(IPAddress.Any, 0);
            try
            {
                var receiveBytes = udpClient.EndReceive(asyncResult, ref endPoint);
                var receiveString = Encoding.ASCII.GetString(receiveBytes);

                var exp = new Regex("BT-SEARCH \\* HTTP/1.1\\r\\nHost: 239.192.152.143:6771\\r\\nPort: (?<port>[^@]+)\\r\\nInfohash: (?<hash>[^@]+)\\r\\n\\r\\n\\r\\n");
                var match = exp.Match(receiveString);

                if (!match.Success)
                    return;

                var portcheck = Convert.ToInt32(match.Groups["port"].Value);
                if (portcheck < 0 || portcheck > 65535)
                    return;

                TorrentManager manager = null;
                var matchHash = InfoHash.FromHex(match.Groups["hash"].Value);
                for (var i = 0; manager == null && i < _engine.Torrents.Count; i++)
                    if (_engine.Torrents[i].InfoHash == matchHash)
                        manager = _engine.Torrents[i];
                
                if (manager == null)
                    return;

                var uri = new Uri(string.Format("tcp://{0}{1}{2}", endPoint.Address, ':', match.Groups["port"].Value));
                var peer = new Peer("", uri, EncryptionTypes.All);

                // Add new peer to matched Torrent
                if (!manager.HasMetadata || !manager.Torrent.IsPrivate)
                {
                    ClientEngine.MainLoop.Queue(() =>
                                                    {
                                                        var count = manager.AddPeersCore(peer);
                                                        manager.RaisePeersFound(new LocalPeersAdded(manager, count, 1));
                                                    });
                }
            }
            catch
            {
                // Failed to receive data, ignore
            }
            finally
            {
                try
                {
                    udpClient.BeginReceive(OnReceiveCallBack, asyncResult.AsyncState);
                }
                catch
                {
                    // It's closed
                }
            }
        }
Esempio n. 6
0
        public void HexTest()
        {
            InfoHash hash = Create();
            string   hex  = hash.ToHex();

            Assert.AreEqual(40, hex.Length, "#1");
            InfoHash other = InfoHash.FromHex(hex);

            Assert.AreEqual(hash, other, "#2");
        }
Esempio n. 7
0
        public static void Main(string[] args)
        {
            Listener listener = new UdpListener(new IPEndPoint(IPAddress.Any, 15000));

            listener.Start();

            DhtEngine engine = new DhtEngine(listener);

            engine.PeersFound += EngineOnPeersFound;
            engine.Start();

            Thread.Sleep(25000);
            engine.GetPeers(InfoHash.FromHex("b415c913643e5ff49fe37d304bbb5e6e11ad5101"));

            Console.ReadLine();
        }
        async void ReceiveAsync(UdpClient client, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                try {
                    UdpReceiveResult result = await client.ReceiveAsync().ConfigureAwait(false);

                    string[] receiveString = Encoding.ASCII.GetString(result.Buffer)
                                             .Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                    string portString   = receiveString.FirstOrDefault(t => t.StartsWith("Port: ", StringComparison.Ordinal));
                    string hashString   = receiveString.FirstOrDefault(t => t.StartsWith("Infohash: ", StringComparison.Ordinal));
                    string cookieString = receiveString.FirstOrDefault(t => t.StartsWith("cookie", StringComparison.Ordinal));

                    // An invalid response was received if these are missing.
                    if (portString == null || hashString == null)
                    {
                        continue;
                    }

                    // If we received our own cookie we can ignore the message.
                    if (cookieString != null && cookieString.Contains(Cookie))
                    {
                        continue;
                    }

                    // If the port is invalid, ignore it!
                    int portcheck = int.Parse(portString.Split(' ').Last());
                    if (portcheck <= 0 || portcheck > 65535)
                    {
                        continue;
                    }

                    var infoHash = InfoHash.FromHex(hashString.Split(' ').Last());
                    var uri      = new Uri($"ipv4://{result.RemoteEndPoint.Address}{':'}{portcheck}");

                    PeerFound?.InvokeAsync(this, new LocalPeerFoundEventArgs(infoHash, uri));
                } catch (FileNotFoundException) {
                    throw;
                } catch {
                }
            }
        }
Esempio n. 9
0
        public static void Main()
        {
            //https://wiki.theory.org/BitTorrentSpecification
            Listener listener = new UdpListener(new IPEndPoint(IPAddress.Any, 15000));

            listener.Start();

            DhtEngine engine = new DhtEngine(listener);

            engine.Start();

            //Wait for the DHT to startup
            Task.Delay(30000).Wait();

            engine.PeersFound += EngineOnPeersFound;
            engine.GetPeers(InfoHash.FromHex("0403FB4728BD788FBCB67E87D6FEB241EF38C75A"));

            Console.ReadLine();
        }
Esempio n. 10
0
        public static InfoHash ToInfoHash(this Magnet magnet)
        {
            if (string.IsNullOrEmpty(magnet.BTIH))
            {
                throw new InvalidDataException("Unable to create InfoHash. Expected bit torrent info hash but null or empty");
            }

            if (magnet.BTIH.Length == 40)
            {
                return(InfoHash.FromHex(magnet.BTIH));
            }

            if (magnet.BTIH.Length == 32)
            {
                return(InfoHash.FromBase32(magnet.BTIH));
            }

            throw new InvalidDataException("Unknown type of hash provided. Expected BTIH of length 32 or 40 chars");
        }
Esempio n. 11
0
        private void OnReceiveCallBack(IAsyncResult ar)
        {
            UdpClient  u = (UdpClient)ar.AsyncState;
            IPEndPoint e = new IPEndPoint(IPAddress.Any, 0);

            try
            {
                byte[] receiveBytes  = u.EndReceive(ar, ref e);
                string receiveString = Encoding.ASCII.GetString(receiveBytes);

                Regex exp   = new Regex("BT-SEARCH \\* HTTP/1.1\\r\\nHost: 239.192.152.143:6771\\r\\nPort: (?<port>[^@]+)\\r\\nInfohash: (?<hash>[^@]+)\\r\\n\\r\\n\\r\\n");
                Match match = exp.Match(receiveString);

                if (!match.Success)
                {
                    return;
                }

                int portcheck = Convert.ToInt32(match.Groups["port"].Value);
                if (portcheck < 0 || portcheck > 65535)
                {
                    return;
                }

                TorrentManager manager   = null;
                InfoHash       matchHash = InfoHash.FromHex(match.Groups["hash"].Value);
                for (int i = 0; manager == null && i < engine.Torrents.Count; i++)
                {
                    if (engine.Torrents [i].InfoHash == matchHash)
                    {
                        manager = engine.Torrents [i];
                    }
                }

                if (manager == null)
                {
                    return;
                }

                Uri  uri  = new Uri("tcp://" + e.Address.ToString() + ':' + match.Groups["port"].Value);
                Peer peer = new Peer("", uri, EncryptionTypes.All);

                // Add new peer to matched Torrent
                if (!manager.HasMetadata || !manager.Torrent.IsPrivate)
                {
                    ClientEngine.MainLoop.Queue(delegate {
                        int count = manager.AddPeersCore(peer);
                        manager.RaisePeersFound(new LocalPeersAdded(manager, count, 1));
                    });
                }
            }
            catch
            {
                // Failed to receive data, ignore
            }
            finally
            {
                try
                {
                    u.BeginReceive(OnReceiveCallBack, ar.AsyncState);
                }
                catch
                {
                    // It's closed
                }
            }
        }
Esempio n. 12
0
 public void NullHex()
 {
     InfoHash.FromHex(null);
 }
Esempio n. 13
0
 public void InvalidHex()
 {
     InfoHash.FromHex("123123123123123123123");
 }
Esempio n. 14
0
 public void InvalidHex()
 {
     Assert.Throws <ArgumentException>(() => InfoHash.FromHex("123123123123123123123"));
 }
Esempio n. 15
0
 public void NullHex()
 {
     Assert.Throws <ArgumentNullException>(() => InfoHash.FromHex(null));
 }
Esempio n. 16
0
 public static string BuildPublicMagnetLink(string infoHash, string releaseTitle)
 {
     return(new MagnetLink(InfoHash.FromHex(infoHash), releaseTitle, _trackers).ToV1String());
 }
Esempio n. 17
0
        static async Task MainAsync(string[] args, CancellationToken token)
        {
            // Give an example of how settings can be modified for the engine.
            var settingBuilder = new EngineSettingsBuilder {
                // Allow the engine to automatically forward ports using upnp/nat-pmp (if a compatible router is available)
                AllowPortForwarding = true,

                // Automatically save a cache of the DHT table when all torrents are stopped.
                AutoSaveLoadDhtCache = true,

                // Automatically save 'FastResume' data when TorrentManager.StopAsync is invoked, automatically load it
                // before hash checking the torrent. Fast Resume data will be loaded as part of 'engine.AddAsync' if
                // torrent metadata is available. Otherwise, if a magnetlink is used to download a torrent, fast resume
                // data will be loaded after the metadata has been downloaded.
                AutoSaveLoadFastResume = true,

                // If a MagnetLink is used to download a torrent, the engine will try to load a copy of the metadata
                // it's cache directory. Otherwise the metadata will be downloaded and stored in the cache directory
                // so it can be reloaded later.
                AutoSaveLoadMagnetLinkMetadata = true,

                // Use a fixed port to accept incoming connections from other peers for testing purposes. Production usages should use a random port, 0, if possible.
                ListenEndPoint = new IPEndPoint(IPAddress.Any, 55123),

                // Use a fixed port for DHT communications for testing purposes. Production usages should use a random port, 0, if possible.
                DhtEndPoint = new IPEndPoint(IPAddress.Any, 55123),
            };

            using var engine = new ClientEngine(settingBuilder.ToSettings());

            Task task;

            if (args.Length == 1 && args[0] == "--vlc")
            {
                task = new VLCStream(engine).StreamAsync(InfoHash.FromHex("AEE0F0082CC2F449412C1DD8AF4C58D9AAEE4B5C"), token);
            }
            else if (args.Length == 1 && MagnetLink.TryParse(args[0], out MagnetLink link))
            {
                task = new MagnetLinkStreaming(engine).DownloadAsync(link, token);
            }
            else
            {
                task = new StandardDownloader(engine).DownloadAsync(token);
            }

            if (engine.Settings.AllowPortForwarding)
            {
                Console.WriteLine("uPnP or NAT-PMP port mappings will be created for any ports needed by MonoTorrent");
            }

            try {
                await task;
            } catch (OperationCanceledException) {
            }

            foreach (var manager in engine.Torrents)
            {
                var stoppingTask = manager.StopAsync();
                while (manager.State != TorrentState.Stopped)
                {
                    Console.WriteLine("{0} is {1}", manager.Torrent.Name, manager.State);
                    await Task.WhenAll(stoppingTask, Task.Delay(250));
                }
                await stoppingTask;
                if (engine.Settings.AutoSaveLoadFastResume)
                {
                    Console.WriteLine($"FastResume data for {manager.Torrent?.Name ?? manager.InfoHash.ToHex ()} has been written to disk.");
                }
            }

            if (engine.Settings.AutoSaveLoadDhtCache)
            {
                Console.WriteLine($"DHT cache has been written to disk.");
            }

            if (engine.Settings.AllowPortForwarding)
            {
                Console.WriteLine("uPnP and NAT-PMP port mappings have been removed");
            }
        }