Exemplo n.º 1
0
        void DownloadLogic(int counter)
        {
            // FIXME: Hardcoded 15kB/sec - is this ok?
            if ((DateTime.Now - manager.StartTime) > TimeSpan.FromSeconds(20))
            {
                foreach (string s in manager.Torrent.GetRightHttpSeeds)
                {
                    string peerId = "-WebSeed-";
                    peerId = peerId + (webseedCount++).ToString().PadLeft(20 - peerId.Length, '0');

                    Uri uri = new Uri(s);
                    // HACK: Don't want to add more than 10 same webseed (sometimes webseeds stuck)
                    if (manager.Peers.ConnectedPeers.FindAll(p => p.Uri.Host.Equals(uri.Host)).Count > 9)
                    {
                        continue;
                    }

                    // Dont' want to add more than 2 same webseed if current webseeds is active (speed more than 5Kbs.
                    if (manager.Peers.ConnectedPeers.FindAll(p => p.Uri.Host.Equals(uri.Host)
                                                            && p.Monitor.DownloadSpeed > 5 * 1024
                                                            ).Count > 1
                        )
                    {
                        continue;
                    }

                    Peer peer = new Peer(peerId, uri);
                    PeerId id = new PeerId(peer, manager);
                    HttpConnection connection = new HttpConnection(new Uri(s));
                    connection.Manager = this.manager;
                    peer.IsSeeder = true;
                    id.BitField.SetAll(true);
                    id.Encryptor = new PlainTextEncryption();
                    id.Decryptor = new PlainTextEncryption();
                    id.IsChoking = false;
                    id.AmInterested = !manager.Complete;
                    id.Connection = connection;
                    id.ClientApp = new Software(id.PeerID);
                    manager.Peers.ConnectedPeers.Add(id);
                    manager.RaisePeerConnected(new PeerConnectionEventArgs(manager, id, Direction.Outgoing));
                    PeerIO.EnqueueReceiveMessage (id.Connection, id.Decryptor, Manager.DownloadLimiter, id.Monitor, id.TorrentManager, id.ConnectionManager.messageReceivedCallback, id);
                }

            }

            // Remove inactive peers we haven't heard from if we're downloading
            if (manager.State == TorrentState.Downloading && manager.lastCalledInactivePeerManager + TimeSpan.FromSeconds(5) < DateTime.Now)
            {
                manager.InactivePeerManager.TimePassed();
                manager.lastCalledInactivePeerManager = DateTime.Now;
            }

            // Now choke/unchoke peers; first instantiate the choke/unchoke manager if we haven't done so already
            if (manager.chokeUnchoker == null)
                manager.chokeUnchoker = new ChokeUnchokeManager(manager, manager.Settings.MinimumTimeBetweenReviews, manager.Settings.PercentOfMaxRateToSkipReview);
            manager.chokeUnchoker.UnchokeReview();
        }
Exemplo n.º 2
0
        void DownloadLogic(int counter)
        {
            // FIXME: Hardcoded 15kB/sec - is this ok?
            if ((DateTime.Now - manager.StartTime) > TimeSpan.FromMinutes(1) && manager.Monitor.DownloadSpeed < 15 * 1024)
            {
                foreach (string s in manager.Torrent.GetRightHttpSeeds)
                {
                    string peerId = "-WebSeed-";
                    peerId = peerId + (webseedCount++).ToString().PadLeft(20 - peerId.Length, '0');

                    Uri uri = new Uri(s);
                    Peer peer = new Peer(peerId, uri);
                    PeerId id = new PeerId(peer, manager);
                    HttpConnection connection = new HttpConnection(new Uri(s));
                    connection.Manager = this.manager;
                    peer.IsSeeder = true;
                    id.BitField.SetAll(true);
                    id.Encryptor = new PlainTextEncryption();
                    id.Decryptor = new PlainTextEncryption();
                    id.IsChoking = false;
					id.AmInterested = !manager.Complete;
                    id.Connection = connection;
					id.ClientApp = new Software(id.PeerID);
                    manager.Peers.ConnectedPeers.Add(id);
					manager.RaisePeerConnected(new PeerConnectionEventArgs(manager, id, Direction.Outgoing));
                    PeerIO.EnqueueReceiveMessage (id.Connection, id.Decryptor, Manager.DownloadLimiter, id.Monitor, id.TorrentManager, id.ConnectionManager.messageReceivedCallback, id);
                }

                // FIXME: In future, don't clear out this list. It may be useful to keep the list of HTTP seeds
                // Add a boolean or something so that we don't add them twice.
                manager.Torrent.GetRightHttpSeeds.Clear();
            }

            // Remove inactive peers we haven't heard from if we're downloading
            if (manager.State == TorrentState.Downloading && manager.lastCalledInactivePeerManager + TimeSpan.FromSeconds(5) < DateTime.Now)
            {
                manager.InactivePeerManager.TimePassed();
                manager.lastCalledInactivePeerManager = DateTime.Now;
            }

            // Now choke/unchoke peers; first instantiate the choke/unchoke manager if we haven't done so already
            if (manager.chokeUnchoker == null)
                manager.chokeUnchoker = new ChokeUnchokeManager(manager, manager.Settings.MinimumTimeBetweenReviews, manager.Settings.PercentOfMaxRateToSkipReview);
            manager.chokeUnchoker.UnchokeReview();
        }
Exemplo n.º 3
0
        private void DownloadLogic(int counter)
        {
            // This timer thing is retarded. We should be checking if we're already downloading from the webseed.
            if ((DateTime.Now - manager.StartTime) > TimeSpan.FromSeconds(1))
            {
                foreach (string s in manager.Torrent.GetRightHttpSeeds)
                {
                    //if we don't have a webseed, insert it
                    if (!manager.Peers.ConnectedPeers.Any(a => a.Peer.ConnectionUri.Equals(new Uri(s))))
                    {
                        string peerId = "-WebSeed-";
                        peerId = peerId + (webseedCount++).ToString().PadLeft(20 - peerId.Length, '0');

                        var uri = new Uri(s);
                        var peer = new Peer(peerId, uri);
                        var id = new PeerId(peer, manager);
                        var connection = new HttpConnection(new Uri(s));
                        connection.Manager = manager;
                        peer.IsSeeder = true;
                        id.BitField.SetAll(true);
                        id.Encryptor = new PlainTextEncryption();
                        id.Decryptor = new PlainTextEncryption();
                        id.IsChoking = false;
                        id.AmInterested = !manager.Complete;
                        id.Connection = connection;
                        id.ClientApp = new Software(id.PeerID);
                        manager.Peers.ConnectedPeers.Add(id);
                        manager.RaisePeerConnected(new PeerConnectionEventArgs(manager, id, Direction.Outgoing));
                        PeerIO.EnqueueReceiveMessage(id.Connection, id.Decryptor, Manager.DownloadLimiter, id.Monitor, id.TorrentManager,
                            id.ConnectionManager.messageReceivedCallback, id);
                    }
                }
            }

            // Remove inactive peers we haven't heard from if we're downloading
            if (manager.State == TorrentState.Downloading &&
                manager.lastCalledInactivePeerManager + TimeSpan.FromSeconds(5) < DateTime.Now)
            {
                manager.InactivePeerManager.TimePassed();
                manager.lastCalledInactivePeerManager = DateTime.Now;
            }

            // Now choke/unchoke peers; first instantiate the choke/unchoke manager if we haven't done so already
            if (manager.chokeUnchoker == null)
                manager.chokeUnchoker = new ChokeUnchokeManager(manager, manager.Settings.MinimumTimeBetweenReviews,
                    manager.Settings.PercentOfMaxRateToSkipReview);
            manager.chokeUnchoker.UnchokeReview();
        }