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(); }
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(); }