Exemplo n.º 1
0
        static async Task RunSeederAsync(IMainLoop mainLoop, string transportDir, string contentDir, Metainfo metainfo, CancellationToken ct)
        {
            var client = new TorrentClientBuilder()
                         .UsePeerId(new PeerId(Encoding.ASCII.GetBytes("SEEDER".PadRight(20, 'X'))))
                         .ConfigureServices(services =>
            {
                services.AddLogging(loggingBuilder => loggingBuilder.AddConsole().SetMinimumLevel(LogLevel.Debug));

                services.AddSingleton(mainLoop);
                services.AddSingleton <ITransportProtocol>(s => new FileTransportProtocol(new DirectoryInfo(transportDir), s.GetRequiredService <PeerId>()));
                services.AddSingleton <ITrackerClientFactory>(s => new SingletonTracker(new FileTracker(transportDir, s.GetRequiredService <PeerId>())));
            })
                         .AddBitTorrentApplicationProtocol()
                         .AddDefaultPipeline()
                         .Build();

            var torrent = client.Add(metainfo, contentDir);

            torrent.Start();

            await Task.Run(() => ct.WaitHandle.WaitOne());

            torrent.Stop();
            client.Dispose();
        }
Exemplo n.º 2
0
        public static void Main(string[] args)
        {
            int    port     = 5000;
            int    uiPort   = 5001;
            bool   runWebUi = false;
            string input    = null;
            string output   = null;
            bool   verbose  = false;

            ArgumentSyntax.Parse(args, syntax =>
            {
                syntax.DefineOption("p|port", ref port, "Port to listen for incoming connections on.");
                syntax.DefineOption("o|output", ref output, "Path to save downloaded files to.");
                syntax.DefineOption("v|verbose", ref verbose, "Show detailed logging information.");
                var uiPortArgument = syntax.DefineOption("ui", ref uiPort, false, "Run a web UI, optionally specifying the port to listen on (default: 5001).");
                runWebUi           = uiPortArgument.IsSpecified;

                syntax.DefineParameter("input", ref input, "Path of torrent file to download.");
            });

            var builder = TorrentClientBuilder.CreateDefaultBuilder();

            // Configure logging
            Log.Logger = new LoggerConfiguration()
                         .MinimumLevel.Is(verbose ? Serilog.Events.LogEventLevel.Debug : Serilog.Events.LogEventLevel.Information)
                         .Enrich.FromLogContext()
                         .WriteTo.Console()
                         .CreateLogger();

            builder.ConfigureServices(services => services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true)));

            // Listen for incoming connections on the specified port
            builder.UsePort(port);

            // Add extension protocol
            builder.ConfigureServices(services =>
            {
                services.AddScoped <IModule>(s =>
                {
                    // TODO: Handle construction of message handlers inside ExtensionProtocolModule
                    var extensionProtocolModule = ActivatorUtilities.CreateInstance <ExtensionProtocolModule>(s);
                    extensionProtocolModule.RegisterMessageHandler(ActivatorUtilities.CreateInstance <PeerExchangeMessageHandler>(s));
                    extensionProtocolModule.RegisterMessageHandler(ActivatorUtilities.CreateInstance <MetadataMessageHandler>(s));
                    return(extensionProtocolModule);
                });
            });

            var client = builder.Build();

            ////if (runWebUi)
            ////{
            ////    var uri = client.EnableWebUI(uiPort);
            ////    Console.WriteLine($"Web UI started at {uri}");
            ////}

            var download = client.Add(input, output);

            download.Start();

            Console.WriteLine("Downloading...");

            using (var timer = new System.Timers.Timer(TimeSpan.FromSeconds(1).TotalMilliseconds))
            {
                timer.Elapsed += (o, e) => LogStatus(download);
                timer.Start();

                download.WaitForDownloadCompletionAsync().Wait();
            }
            Console.ReadKey();
        }