无法使用 monotorrent 下载 torrent(“无法建立连接,因为目标机器主动拒绝它”)

Posted

技术标签:

【中文标题】无法使用 monotorrent 下载 torrent(“无法建立连接,因为目标机器主动拒绝它”)【英文标题】:can not download torrent using monotorrent ("no connection could be made because the target machine actively refused it") 【发布时间】:2013-07-13 08:51:21 【问题描述】:

我正在尝试使用monotorrent 下载种子。我刚刚从其github repository 下载了一个示例程序并进行了必要的更改。

它在受尊重的位置创建所有文件,大小为 0 字节并且没有任何进展。当通过堆栈跟踪运行时,我发现它抛出了一个异常说no connection could be made because the target machine actively refused it。这是一个已处理的异常。我只能在堆栈跟踪中看到这个。

same torrent可以通过我的windows操作系统上的uTorrent程序下载。

I have set upped the Git repository for my project here

这是我所有的代码。这是不完整的代码..?我还需要添加什么..?

using System;
using System.Collections.Generic;
using MonoTorrent.Client;
using MonoTorrent.Client.Encryption;
using System.IO;
using MonoTorrent.Common;
using System.Net;
using System.Web;
using MonoTorrent.Tracker;
using MonoTorrent.Tracker.Listeners;

namespace Samples

    public class ClientSample
    
        BanList banlist;
        ClientEngine engine;
        List<TorrentManager> managers = new List<TorrentManager>();

        public ClientSample()
        
            //StartTracker();
            SetupEngine();
            //SetupBanlist();
            LoadTorrent();
            StartTorrents();
        

        void SetupEngine()
        
            EngineSettings settings = new EngineSettings();
            settings.AllowedEncryption = ChooseEncryption();

            // If both encrypted and unencrypted connections are supported, an encrypted connection will be attempted
            // first if this is true. Otherwise an unencrypted connection will be attempted first.
            settings.PreferEncryption = true;

            // Torrents will be downloaded here by default when they are registered with the engine
            //settings.SavePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Torrents");
            settings.SavePath = HttpContext.Current.Request.MapPath("~/Torrents/");

            // The maximum upload speed is 200 kilobytes per second, or 204,800 bytes per second
            settings.GlobalMaxUploadSpeed = 200 * 1024;

            engine = new ClientEngine(settings);

            // Tell the engine to listen at port 6969 for incoming connections
            engine.ChangeListenEndpoint(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6969));
        

        EncryptionTypes ChooseEncryption()
        
            EncryptionTypes encryption;
            // This completely disables connections - encrypted connections are not allowed
            // and unencrypted connections are not allowed
            encryption = EncryptionTypes.None;

            // Only unencrypted connections are allowed
            encryption = EncryptionTypes.PlainText;

            // Allow only encrypted connections
            encryption = EncryptionTypes.RC4Full | EncryptionTypes.RC4Header;

            // Allow unencrypted and encrypted connections
            encryption = EncryptionTypes.All;
            encryption = EncryptionTypes.PlainText | EncryptionTypes.RC4Full | EncryptionTypes.RC4Header;

            return encryption;
        

        void SetupBanlist()
        
            banlist = new BanList();

            if (!File.Exists("banlist"))
                return;

            // The banlist parser can parse a standard block list from peerguardian or similar services
            BanListParser parser = new BanListParser();
            IEnumerable<AddressRange> ranges = parser.Parse(File.OpenRead("banlist"));
            banlist.AddRange(ranges);

            // Add a few IPAddress by hand
            banlist.Add(IPAddress.Parse("12.21.12.21"));
            banlist.Add(IPAddress.Parse("11.22.33.44"));
            banlist.Add(IPAddress.Parse("44.55.66.77"));

            engine.ConnectionManager.BanPeer += delegate(object o, AttemptConnectionEventArgs e)
            
                IPAddress address;

                // The engine can raise this event simultaenously on multiple threads
                if (IPAddress.TryParse(e.Peer.ConnectionUri.Host, out address))
                
                    lock (banlist)
                    
                        // If the value of e.BanPeer is true when the event completes,
                        // the connection will be closed. Otherwise it will be allowed
                        e.BanPeer = banlist.IsBanned(address);
                    
                
            ;
        

        void LoadTorrent()
        
            // Load a .torrent file into memory
            //Torrent torrent = Torrent.Load("myfile.torrent");
            Torrent torrent = Torrent.Load(HttpContext.Current.Request.MapPath("~/myfile.torrent"));

            // Set all the files to not download
            foreach (TorrentFile file in torrent.Files)
                file.Priority = Priority.Normal;

            // Set the first file as high priority and the second one as normal
            //torrent.Files[0].Priority = Priority.Highest;
            //torrent.Files[1].Priority = Priority.Normal;

            //TorrentManager manager = new TorrentManager(torrent, "DownloadFolder", new TorrentSettings());
            TorrentManager manager = new TorrentManager(torrent, HttpContext.Current.Request.MapPath("~/Torrents/"), new TorrentSettings());

            managers.Add(manager);
            engine.Register(manager);

            // Disable rarest first and randomised picking - only allow priority based picking (i.e. selective downloading)
            PiecePicker picker = new StandardPicker();
            picker = new PriorityPicker(picker);
            manager.ChangePicker(picker);
        

        void StartTorrents()
        
            engine.StartAll();
        
    

【问题讨论】:

你检查你的防火墙了吗?您的防火墙可能允许 uTorrent,但不允许您的自定义程序。 @NateDiamond - 是的.. 它要求我第一次允许 IIS 访问网络并且它允许访问。但没有运气。 你能用 HTTPClient 得到任何响应吗? 我可以使用WebClient下载文件并且可以成功HttpWebRequest 你用不同的追踪器试过了吗?还是只有几个?也许在你的本地机器上做一个跟踪器,看看你是否得到回应? 【参考方案1】:

这可能是因为有问题的跟踪器阻止了未知客户端,例如您正在开发的客户端。尝试使用 Monotorrents 自己的工具创建一个 torrent 并将其上传到公共跟踪器,例如 kat.ph

【讨论】:

我不是在创建种子。我只需要下载 torrent 我并不是说您必须创建自己的种子,而是尝试一些不同的种子,以确保它不是阻止第三方客户端的跟踪器。 一些 torrent 客户端应用程序允许您创建具有连接权限的客户端列表。有些应用程序会主动拒绝黑名单上的 IP 地址(对等监护人)。有太多变量无法在野外调试您的代码。 我已经为我的项目设置了一个 Git 存储库。如果您可以或对存储库中的代码进行要求更改,请尝试在您的机器上运行此代码。 github.com/goforgold/MonoTorrentSample【参考方案2】:

如果有帮助的话,我刚刚成功地将 MonoTorrent 集成到我自己的项目中。我基本上放弃了使用网站上的示例代码从头开始编写自己的代码,而是使用了 git repo 中的 SampleClient。我敢打赌,您可以轻松地对其进行修改以满足您的需求,因此请尝试一下。我仍然会说您收到“连接被拒绝”错误的原因是因为您正在尝试在不允许他们不知道的 torrent 应用程序参与的跟踪器上下载 torrent。你说你已经尝试了几个种子,但这些种子可能都使用同一个跟踪器。

HTH。

【讨论】:

在这种情况下,您能否为我提供一些种子链接,以供我尝试...? 我认为上传到 kat.ph 的任何内容都可以使用,无论如何它都对我有用。尝试使用他们的示例代码创建一个简单的 torrent,将其上传到 Kat.ph 并使用现有客户端播种,同时尝试使用您自己的客户端下载。我已经成功上传并下载了这个种子(合法种子,冷静下来):krasnostav.zombies.nu/archive/DayZero-0.9.9.5.torrent

以上是关于无法使用 monotorrent 下载 torrent(“无法建立连接,因为目标机器主动拒绝它”)的主要内容,如果未能解决你的问题,请参考以下文章

页面仍在加载时返回数据

MonoTorrent 客户端无法达到最大下载和上传速度

使用 Monotorrent 在 VB.NET 中加载 Torrent

Monotorrent 示例客户端不要下载一些种子

monotorrent - writeRate/readRate 不工作

Monotorrent 传输文件