示例#1
0
 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;
 }
示例#2
0
 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;
 }
示例#3
0
 /// <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);
 }
示例#4
0
 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);
 }
示例#5
0
        /// <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);
        }
示例#6
0
 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);
 }
示例#7
0
 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);
 }
示例#8
0
        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;
        }
示例#9
0
        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;
        }
示例#10
0
 public DownloadMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor) :
     base(manager, strategist, metadata, monitor)
 {
     strategist.HavePiece += (sender, args) => SendHaveMessages(args.Value);
 }
示例#11
0
 public SeedMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor)
     :
     base(manager, strategist, metadata, monitor)
 {
 }
示例#12
0
 public SeedMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor)
     : base(manager, strategist, metadata, monitor)
 {
 }
示例#13
0
 public DownloadMode(BlockManager manager, BlockStrategist strategist, TorrentData metadata, TransferMonitor monitor)
     : base(manager, strategist, metadata, monitor)
 {
     strategist.HavePiece += (sender, args) => SendHaveMessages(args.Value);
 }