Beispiel #1
0
        private void MessageReceived(bool successful, PeerMessage message, object state)
        {
            var id = (PeerId)state;

            if (!successful)
            {
                id.ConnectionManager.CleanupSocket(id, "Could not receive a message");
                return;
            }

            try
            {
                var e = new PeerMessageEventArgs(id.TorrentManager, message, Direction.Incoming, id);
                id.ConnectionManager.RaisePeerMessageTransferred(e);

                message.Handle(id);

                id.LastMessageReceived = DateTime.Now;
                PeerIO.EnqueueReceiveMessage(id.Connection, id.Decryptor, id.TorrentManager.DownloadLimiter, id.Monitor,
                                             id.TorrentManager, MessageReceivedCallback, id);
            }
            catch (TorrentException ex)
            {
                id.ConnectionManager.CleanupSocket(id, ex.Message);
            }
        }
Beispiel #2
0
        private void PeerHandshakeReceived(bool succeeded, PeerMessage message, object state)
        {
            var id = (PeerId)state;

            if (!succeeded)
            {
                CleanupSocket(id, "Handshaking failed");
                return;
            }

            try
            {
                message.Handle(id);

                // If there are any pending messages, send them otherwise set the queue
                // processing as finished.
                if (id.QueueLength > 0)
                {
                    id.ConnectionManager.ProcessQueue(id);
                }
                else
                {
                    id.ProcessingQueue = false;
                }

                PeerIO.EnqueueReceiveMessage(id.Connection, id.Decryptor, id.TorrentManager.DownloadLimiter, id.Monitor,
                                             id.TorrentManager, MessageReceivedCallback, id);
                // Alert the engine that there is a new usable connection
                id.TorrentManager.HandlePeerConnected(id, Direction.Outgoing);
            }
            catch (TorrentException ex)
            {
                CleanupSocket(id, ex.Message);
            }
        }
Beispiel #3
0
        private void DownloadLogic(int counter)
        {
            var needAddWebSeeds = (DateTime.Now - _manager.StartTime) > TimeSpan.FromMinutes(1) &&
                                  _manager.Monitor.DownloadSpeed < _addWebSeedsSpeedLimit * 1024;

            if (needAddWebSeeds || _addWebSeedsSpeedLimit == 0)
            {
                foreach (var s in _manager.Torrent.GetRightHttpSeeds)
                {
                    var 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);
                }

                // 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();
        }
Beispiel #4
0
        /// <summary>
        ///   This method is called when the ClientEngine recieves a valid incoming connection
        /// </summary>
        private void IncomingConnectionAccepted(bool succeeded, int count, object state)
        {
            var id = (PeerId)state;

            try
            {
                if (!succeeded)
                {
                    var args = new PeerConnectionFailedEventArgs(id.TorrentManager, id.Peer, Direction.Incoming,
                                                                 "Incoming connection coult not be accepted");
                    id.TorrentManager.RaiseConnectionAttemptFailed(args);
                }

                var maxAlreadyOpen = OpenConnections >=
                                     Math.Min(MaxOpenConnections, id.TorrentManager.Settings.MaxConnections);
                if (!succeeded || id.Peer.PeerId == _engine.PeerId || maxAlreadyOpen)
                {
                    CleanupSocket(id, "Connection was not accepted");
                    return;
                }

                if (id.TorrentManager.Peers.ActivePeers.Contains(id.Peer))
                {
                    Logger.Log(id.Connection, "ConnectionManager - Already connected to peer");
                    id.Connection.Dispose();
                    return;
                }

                Logger.Log(id.Connection, "ConnectionManager - Incoming connection fully accepted");
                id.TorrentManager.Peers.AvailablePeers.Remove(id.Peer);
                id.TorrentManager.Peers.ActivePeers.Add(id.Peer);
                id.TorrentManager.Peers.ConnectedPeers.Add(id);
                id.WhenConnected = DateTime.Now;
                // Baseline the time the last block was received
                id.LastBlockReceived = DateTime.Now;

                id.TorrentManager.HandlePeerConnected(id, Direction.Incoming);

                // We've sent our handshake so begin our looping to receive incoming message
                PeerIO.EnqueueReceiveMessage(id.Connection, id.Decryptor, id.TorrentManager.DownloadLimiter, id.Monitor,
                                             id.TorrentManager, MessageReceivedCallback, id);
            }
            catch (Exception e)
            {
                CleanupSocket(id, e.Message);
            }
        }