public BlockManager(TorrentData data, string mainDir) { _blocksPerPiece = (int)Math.Ceiling((double)data.PieceLength / BlockSize); _readCache = new Cache <BlockReadState>(); _writeCache = new Cache <BlockWriteState>(); _openStreams = new ConcurrentDictionary <string, FileStream>(); _torrentData = data; _pieceSize = data.PieceLength; MainDirectory = mainDir; }
public BlockManager(TorrentData data, string mainDir) { blocksPerPiece = (int)Math.Ceiling((double)data.PieceLength/BlockSize); readCache = new Cache<BlockReadState>(); writeCache = new Cache<BlockWriteState>(); openStreams = new ConcurrentDictionary<string, FileStream>(); torrentData = data; pieceSize = data.PieceLength; MainDirectory = mainDir; }
/// <summary> /// Initialize a torrent transfer with metadata read from the specified stream. /// </summary> /// <param name="torrentStream">The stream to read the torrent metadata from.</param> public TorrentTransfer(Stream torrentStream, string downloadPath) { using (torrentStream) //разкодиране на метаданните using (var reader = new BinaryReader(torrentStream)) { var bytes = reader.ReadBytes((int)reader.BaseStream.Length); Data = new TorrentData(bytes); } //създаване на класове за комуникация с тракера, //отчитане на състояние DownloadFolder = Path.Combine(downloadPath, Data.Name); }
public AnnounceManager(IEnumerable <string> announceUrls, TransferMonitor monitor, TorrentData data) { //иницализация на списъка с тракери, състоящ се от класове TrackerInfo, които осигуряват //връзка с отделни тракери и заявки до тях trackers = new List <TrackerInfo>(); //прибавяне на HTTP тракерите от подадения списък с адреси trackers.AddRange(announceUrls.Where(u => u.StartsWith("http")).Select(u => new TrackerInfo(u))); //прикачане на събитието PeersReceived към всеки от тракерите (TrackerInfo) trackers.ForEach(t => t.PeersReceived += (sender, args) => OnPeersReceived(args.Value)); Monitor = monitor; Data = data; //инициализация на таймер за проверка на състоянието на всеки тракер regularTimer = new Timer(Regular); regularTimer.Change(1000, 5000); }
/// <summary> /// Initialize a torrent transfer with metadata read from the specified stream. /// </summary> /// <param name="torrentStream">The stream to read the torrent metadata from.</param> public TorrentTransfer(Stream torrentStream, string downloadPath) { Contract.Requires(torrentStream != null); using (torrentStream) //разкодиране на метаданните using (var reader = new BinaryReader(torrentStream)) { byte[] bytes = reader.ReadBytes((int) reader.BaseStream.Length); Data = new TorrentData(bytes); } //създаване на класове за комуникация с тракера, //отчитане на състояние DownloadFolder = Path.Combine(downloadPath, Data.Name); }
protected TorrentMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor) { //инициализация на обект за следене на пренесените данни Monitor = monitor; //обект за управляване на записа на парчета върху файловата система BlockManager = manager; //обект за управление на заявките на парчета към пиърите BlockStrategist = strategist; //обект, съдържаш метаданните на торента Metadata = metadata; //съобщение за здрависване, което се използва от този TorrentMode DefaultHandshake = new HandshakeMessage(Global.Instance.PeerId, new byte[8], Metadata.InfoHash, "BitTorrent protocol"); //конкурентен речник за съхранение на състоянието на активните пиъри Peers = new ConcurrentDictionary<string, PeerState>(); //прикачане на събитието за изключения на BlockManager-а manager.RaisedException += (s, e) => HandleException(e.Value); //инициализация на теймера за изпращане на KeepAlive съобщения KeepAliveTimer = new Timer(SendKeepAlives); }
protected TorrentMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor) { //инициализация на обект за следене на пренесените данни Monitor = monitor; //обект за управляване на записа на парчета върху файловата система BlockManager = manager; //обект за управление на заявките на парчета към пиърите BlockStrategist = strategist; //обект, съдържаш метаданните на торента Metadata = metadata; //съобщение за здрависване, което се използва от този TorrentMode DefaultHandshake = new HandshakeMessage(Global.Instance.PeerId, new byte[8], Metadata.InfoHash, "BitTorrent protocol"); //конкурентен речник за съхранение на състоянието на активните пиъри Peers = new ConcurrentDictionary <string, PeerState>(); //прикачане на събитието за изключения на BlockManager-а manager.RaisedException += (s, e) => HandleException(e.Value); //инициализация на теймера за изпращане на KeepAlive съобщения KeepAliveTimer = new Timer(SendKeepAlives); }
public BlockStrategist(TorrentData data) { _blockSize = Global.Instance.BlockSize; _pieceSize = data.PieceLength; _totalSize = data.Files.Sum(f => f.Length); _blockCount = (int)Math.Ceiling((float)_totalSize / _blockSize); _pieces = new int[data.PieceCount]; Bitfield = new BitArray(data.PieceCount); _unavailable = new BlockAddressCollection <int>(); for (var i = 0; i < _blockCount; i++) { _unavailable.Add(i); } for (var i = 0; i < data.PieceCount - 1; i++) { _pieces[i] = data.PieceLength; } var lastLength = (int)(data.TotalLength - data.PieceLength * (data.PieceCount - 1)); _pieces[_pieces.Length - 1] = lastLength; }
public BlockStrategist(TorrentData data) { this.blockSize = Global.Instance.BlockSize; pieceSize = data.PieceLength; totalSize = data.Files.Sum(f => f.Length); blockCount = (int)Math.Ceiling((float)totalSize / blockSize); pieces = new int[data.PieceCount]; Bitfield = new BitArray(data.PieceCount); unavailable = new BlockAddressCollection <int>(); for (int i = 0; i < blockCount; i++) { unavailable.Add(i); } for (int i = 0; i < data.PieceCount - 1; i++) { pieces[i] = data.PieceLength; } int lastLength = (int)(data.TotalLength - (data.PieceLength * (data.PieceCount - 1))); pieces[pieces.Length - 1] = lastLength; }
public DownloadMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor) : base(manager, strategist, metadata, monitor) { strategist.HavePiece += (sender, args) => SendHaveMessages(args.Value); }
public SeedMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor) : base(manager, strategist, metadata, monitor) { }