예제 #1
0
        internal async Task StartAsync()
        {
            CheckDisposed();
            if (!IsRunning)
            {
                IsRunning = true;

                Listener.Start();
                LocalPeerDiscovery.Start();
                await DhtEngine.StartAsync(await MaybeLoadDhtNodes());

                if (Settings.AllowPortForwarding)
                {
                    await PortForwarder.StartAsync(CancellationToken.None);
                }

                if (Listener is ISocketListener socketListener)
                {
                    await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Tcp, socketListener.EndPoint.Port));
                }
                else
                {
                    await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Tcp, Settings.ListenPort));
                }

                if (DhtListener.EndPoint != null)
                {
                    await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Udp, DhtListener.EndPoint.Port));
                }
            }
        }
예제 #2
0
        internal async Task StopAsync()
        {
            CheckDisposed();
            // If all the torrents are stopped, stop ticking
            IsRunning = allTorrents.Exists(m => m.State != TorrentState.Stopped);
            if (!IsRunning)
            {
                if (PeerListener.LocalEndPoint != null)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Tcp, PeerListener.LocalEndPoint.Port), CancellationToken.None);
                }

                if (DhtListener.LocalEndPoint != null)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Udp, DhtListener.LocalEndPoint.Port), CancellationToken.None);
                }

                PeerListener.Stop();
                LocalPeerDiscovery.Stop();

                if (Settings.AllowPortForwarding)
                {
                    await PortForwarder.StopAsync(CancellationToken.None);
                }

                await MaybeSaveDhtNodes();

                await DhtEngine.StopAsync();
            }
        }
예제 #3
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            IPortForwarder portForwarder = new PortForwarder();
            IPortChecker   portChecker   = new PortChecker();

            Application.Run(new FrmMain(portForwarder, portChecker));
        }
예제 #4
0
 internal async Task StopAsync()
 {
     CheckDisposed();
     // If all the torrents are stopped, stop ticking
     IsRunning = allTorrents.Exists(m => m.State != TorrentState.Stopped);
     if (!IsRunning)
     {
         Listener.Stop();
         await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Tcp, Settings.ListenPort), CancellationToken.None);
     }
 }
예제 #5
0
 internal async Task StartAsync()
 {
     CheckDisposed();
     if (!IsRunning)
     {
         IsRunning = true;
         if (Listener.Status == ListenerStatus.NotListening)
         {
             Listener.Start();
         }
         await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Tcp, Settings.ListenPort));
     }
 }
예제 #6
0
        async Task UpdateSettingsAsync(EngineSettings oldSettings, EngineSettings newSettings)
        {
            await DiskManager.UpdateSettingsAsync(newSettings);

            if (newSettings.DiskCacheBytes != oldSettings.DiskCacheBytes)
            {
                await Task.WhenAll(Torrents.Select(t => DiskManager.FlushAsync(t)));
            }

            ConnectionManager.Settings = newSettings;

            if (oldSettings.AllowPortForwarding != newSettings.AllowPortForwarding)
            {
                if (newSettings.AllowPortForwarding)
                {
                    await PortForwarder.StartAsync(CancellationToken.None);
                }
                else
                {
                    await PortForwarder.StopAsync(removeExistingMappings : true, CancellationToken.None);
                }
            }

            if (oldSettings.DhtPort != newSettings.DhtPort)
            {
                if (DhtListener.EndPoint != null)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Udp, DhtListener.EndPoint.Port), CancellationToken.None);
                }
                else if (oldSettings.DhtPort > 0)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Udp, oldSettings.DhtPort), CancellationToken.None);
                }

                DhtListener = DhtListenerFactory.CreateUdp(newSettings.DhtPort);

                if (oldSettings.DhtPort == -1)
                {
                    await RegisterDht(DhtEngineFactory.Create(DhtListener));
                }
                else if (newSettings.DhtPort == -1)
                {
                    await RegisterDht(new NullDhtEngine());
                }

                DhtEngine.SetListener(DhtListener);

                if (IsRunning)
                {
                    DhtListener.Start();
                    if (Listener is ISocketListener newDhtListener)
                    {
                        await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Udp, newDhtListener.EndPoint.Port));
                    }
                    else
                    {
                        await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Udp, newSettings.DhtPort));
                    }
                }
            }

            if (oldSettings.ListenPort != newSettings.ListenPort)
            {
                if (Listener is ISocketListener oldListener)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Tcp, oldListener.EndPoint.Port), CancellationToken.None);
                }
                else if (oldSettings.ListenPort > 0)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Tcp, oldSettings.ListenPort), CancellationToken.None);
                }

                Listener.Stop();
                Listener = PeerListenerFactory.CreateTcp(newSettings.ListenPort);
                listenManager.SetListener(Listener);

                if (IsRunning)
                {
                    Listener.Start();
                    // The settings could say to listen at port 0, which means 'choose one dynamically'
                    if (Listener is ISocketListener peerListener)
                    {
                        await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Tcp, peerListener.EndPoint.Port));
                    }
                    else
                    {
                        await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Tcp, newSettings.ListenPort));
                    }
                }
            }

            // This depends on the Listener binding to it's local port.
            var localPort = newSettings.ListenPort;

            if (Listener is ISocketListener newListener)
            {
                localPort = newListener.EndPoint.Port;
            }

            if ((oldSettings.AllowLocalPeerDiscovery != newSettings.AllowLocalPeerDiscovery) ||
                (oldSettings.ListenPort != newSettings.ListenPort))
            {
                RegisterLocalPeerDiscovery(newSettings.AllowLocalPeerDiscovery && localPort > 0 ? new LocalPeerDiscovery(localPort) : null);
            }
        }
예제 #7
0
 /// <summary>
 /// Sets <see cref="PortForwardingEnabled"/> to false and the engine will no longer
 /// seach for uPnP or NAT-PMP compatible devices. Ports forwarding requests will
 /// be deleted, where possible.
 /// </summary>
 /// <param name="token">If the token is cancelled the engine is guaranteed to no longer search
 /// for compatible devices, but existing port forwarding requests may not be deleted.</param>
 /// <returns></returns>
 public async Task DisablePortForwardingAsync(CancellationToken token)
 {
     await PortForwarder.StopAsync(true, token);
 }
예제 #8
0
 /// <summary>
 /// Sets <see cref="PortForwardingEnabled"/> to true and begins searching for uPnP or
 /// NAT-PMP compatible devices. If any are discovered they will be used to forward the
 /// ports used by the engine.
 /// </summary>
 /// <param name="token">If the token is cancelled and an <see cref="OperationCanceledException"/>
 /// is thrown then the engine is guaranteed to not be searching for compatible devices.</param>
 /// <returns></returns>
 public async Task EnablePortForwardingAsync(CancellationToken token)
 {
     await PortForwarder.StartAsync(token);
 }
예제 #9
0
        async Task UpdateSettingsAsync(EngineSettings oldSettings, EngineSettings newSettings)
        {
            await DiskManager.UpdateSettingsAsync(newSettings);

            if (newSettings.DiskCacheBytes != oldSettings.DiskCacheBytes)
            {
                await Task.WhenAll(Torrents.Select(t => DiskManager.FlushAsync(t)));
            }

            ConnectionManager.Settings = newSettings;

            if (oldSettings.UsePartialFiles != newSettings.UsePartialFiles)
            {
                foreach (var manager in Torrents)
                {
                    await manager.UpdateUsePartialFiles(newSettings.UsePartialFiles);
                }
            }
            if (oldSettings.AllowPortForwarding != newSettings.AllowPortForwarding)
            {
                if (newSettings.AllowPortForwarding)
                {
                    await PortForwarder.StartAsync(CancellationToken.None);
                }
                else
                {
                    await PortForwarder.StopAsync(removeExistingMappings : true, CancellationToken.None);
                }
            }

            if (oldSettings.DhtEndPoint != newSettings.DhtEndPoint)
            {
                if (DhtListener.LocalEndPoint != null)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Udp, DhtListener.LocalEndPoint.Port), CancellationToken.None);
                }
                DhtListener.Stop();

                if (newSettings.DhtEndPoint == null)
                {
                    DhtListener = new NullDhtListener();
                    await RegisterDht(new NullDhtEngine());
                }
                else
                {
                    DhtListener = Factories.CreateDhtListener(Settings.DhtEndPoint) ?? new NullDhtListener();
                    if (IsRunning)
                    {
                        DhtListener.Start();
                    }

                    if (oldSettings.DhtEndPoint == null)
                    {
                        var dht = Factories.CreateDht();
                        await dht.SetListenerAsync(DhtListener);
                        await RegisterDht(dht);
                    }
                    else
                    {
                        await DhtEngine.SetListenerAsync(DhtListener);
                    }
                }

                if (DhtListener.LocalEndPoint != null)
                {
                    await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Udp, DhtListener.LocalEndPoint.Port));
                }
            }

            if (!Equals(oldSettings.ListenEndPoint, newSettings.ListenEndPoint))
            {
                if (PeerListener.LocalEndPoint != null)
                {
                    await PortForwarder.UnregisterMappingAsync(new Mapping (Protocol.Tcp, PeerListener.LocalEndPoint.Port), CancellationToken.None);
                }

                PeerListener.Stop();
                PeerListener = (newSettings.ListenEndPoint == null ? null : Factories.CreatePeerConnectionListener(newSettings.ListenEndPoint)) ?? new NullPeerListener();
                listenManager.SetListener(PeerListener);

                if (IsRunning)
                {
                    PeerListener.Start();
                    // The settings could say to listen at port 0, which means 'choose one dynamically'
                    if (PeerListener.LocalEndPoint != null)
                    {
                        await PortForwarder.RegisterMappingAsync(new Mapping (Protocol.Tcp, PeerListener.LocalEndPoint.Port));
                    }
                }
            }

            if (oldSettings.AllowLocalPeerDiscovery != newSettings.AllowLocalPeerDiscovery)
            {
                RegisterLocalPeerDiscovery(!newSettings.AllowLocalPeerDiscovery ? null : Factories.CreateLocalPeerDiscovery());
            }
        }