internal void RaisePeerMessageTransferred(PeerMessageEventArgs e)
        {
            if (PeerMessageTransferred == null)
            {
                return;
            }

            ThreadPool.QueueUserWorkItem(delegate
            {
                EventHandler <PeerMessageEventArgs> h = PeerMessageTransferred;
                if (h == null)
                {
                    return;
                }

                if (!(e.Message is MessageBundle))
                {
                    h(e.TorrentManager, e);
                }
                else
                {
                    // Message bundles are only a convience for internal usage!
                    MessageBundle b = (MessageBundle)e.Message;
                    foreach (PeerMessage message in b.Messages)
                    {
                        PeerMessageEventArgs args = new PeerMessageEventArgs(e.TorrentManager, message, e.Direction, e.ID);
                        h(args.TorrentManager, args);
                    }
                }
            });
        }
        private void MessageReceived(bool successful, PeerMessage message, object state)
        {
            PeerId id = (PeerId)state;

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

            try
            {
                PeerMessageEventArgs e = new PeerMessageEventArgs(id.TorrentManager, (PeerMessage)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);
            }
        }
        private void MessageReceived(bool successful, PeerMessage message, object state)
        {
            PeerId id = (PeerId) state;
            if (!successful)
            {
                id.ConnectionManager.CleanupSocket (id, "Could not receive a message");
                return;
            }

            try
            {
                PeerMessageEventArgs e = new PeerMessageEventArgs(id.TorrentManager, (PeerMessage)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);
            }
        }
        internal void RaisePeerMessageTransferred(PeerMessageEventArgs e)
        {
            if (PeerMessageTransferred == null)
                return;

            ThreadPool.QueueUserWorkItem(delegate
            {
                EventHandler<PeerMessageEventArgs> h = PeerMessageTransferred;
                if (h == null)
                    return;

                if (!(e.Message is MessageBundle))
                {
                    h(e.TorrentManager, e);
                }
                else
                {
                    // Message bundles are only a convience for internal usage!
                    MessageBundle b = (MessageBundle)e.Message;
                    foreach (PeerMessage message in b.Messages)
                    {
                        PeerMessageEventArgs args = new PeerMessageEventArgs(e.TorrentManager, message, e.Direction, e.ID);
                        h(args.TorrentManager, args);
                    }
                }
            });
        }
Exemple #5
0
        void HandlePeerMessageTransferred(object sender, PeerMessageEventArgs e)
        {
            if (e.Direction != Direction.Incoming)
                return;
            if (!(e.Message is MonoTorrent.Client.Messages.Standard.HaveMessage))
                return;

            swarmSpeed.AddDelta (manager.Torrent.PieceLength);
        }
Exemple #6
0
        private static void ProcessMessage(PeerId id, ArraySegment<byte> buffer, int count)
        {
            string reason = "";
            bool cleanUp = false;
            try
            {
                try
                {
                    PeerMessage message = PeerMessage.DecodeMessage(buffer, 0, 4 + count, id.TorrentManager);

                    // Fire the event to say we recieved a new message
                    PeerMessageEventArgs e = new PeerMessageEventArgs(id.TorrentManager, (PeerMessage)message, Direction.Incoming, id);
                    id.ConnectionManager.RaisePeerMessageTransferred(e);

                    message.Handle(id);
                }
                catch (Exception ex)
                {
                    // Should i nuke the peer with the dodgy message too?
                    Logger.Log(null, "*CRITICAL EXCEPTION* - Error decoding message: {0}", ex);
                }
                finally
                {
                    ClientEngine.BufferManager.FreeBuffer(ref buffer);
                }

                //FIXME: I thought i was using 5 (i changed the check below from 3 to 5)...
                // if the peer has sent us three bad pieces, we close the connection.
                if (id.Peer.TotalHashFails == 5)
                {
                    reason = "5 hashfails";
                    Logger.Log(id.Connection, "ConnectionManager - 5 hashfails");
                    cleanUp = true;
                    return;
                }

                id.LastMessageReceived = DateTime.Now;
            }
            catch (TorrentException ex)
            {
                reason = ex.Message;
                Logger.Log(id.Connection, "Invalid message recieved: {0}", ex.Message);
                cleanUp = true;
                return;
            }
            finally
            {
                if (cleanUp)
                    id.ConnectionManager.CleanupSocket(id, reason);
            }
        }
		private void OnPeerMessageTransferred(object sender, PeerMessageEventArgs args)
		{
			// FIXME: Swarm speed infinitely grows :S
			if(args.Direction != Direction.Incoming)
				return;
			
			if(!torrentSwarm.ContainsKey(args.TorrentManager))
				torrentSwarm.Add(args.TorrentManager, 0);
			
			torrentSwarm[args.TorrentManager]++;
		}