c# - 使用多个连接和多宿主下载文件

标签 c# visual-studio-2010 download-manager multihomed

我是一名大四学生。我的毕业设计是一个下载管理器,我打算用 C# 编写它。 当查看 MSDN 文档时,该项目看起来很简单。但问题是我的老师要我将多宿主合并到项目中。他希望下载管理器:

  1. 将用户要下载的文件拆分为多个部分。
  2. 对于每个片段,DM 应该创建一个连接并从服务器请求该片段。
  3. 在所有片段完成下载后,DM 应将片段合并到一个文件中。
  4. 如果存在多宿主,则每个连接都应该通过(或路由)不同的 ISP(当使用多宿主时,计算机通过多个网络适配器连接到多个 ISP)因为这个过程应该加速文件的下载.

我可以完成前三个步骤,但我找不到第四个步骤的解决方案,所以任何人都可以帮助我或指导我通过正确的方式。

我不是经验丰富的网络和协议(protocol)程序员,我只选择 C#,因为它简化了发送和请求文件的过程。

最佳答案

我相信您的答案在于 ServicePoint.BindIPEndPointDelegate属性,您可以在 HttpWebRequest 实例中设置。引用 MSDN:

Some load balancing techniques require a client to use a specific local IP address and port number, rather than IPAddress.Any (or IPAddress.IPv6Any for Internet Protocol Version 6) and an ephemeral port. Your BindIPEndPointDelegate can satisfy this requirement.

基本上,BindIPEndPointDelegate 允许您选择要用于连接的本地端点。您可以使用 Dns.GetHostAddresses(Dns.GetHostName()) 检索所有本地 IP 地址的列表,然后在委托(delegate)中随机选择一个。但是,您确实需要注意匹配地址族:如果远程端点是 IPv6,则需要选择一个本地 IPv6 地址。

我在下面包含了一些示例代码。

Uri uri = new Uri("http://google.com");

Random random = new Random();
IPAddress[] localAddresses = Dns.GetHostAddresses(Dns.GetHostName());

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.ServicePoint.BindIPEndPointDelegate =
    (servicePoint, remoteEndPoint, retryCount) =>
    {
        var allowedLocalAddresses = 
            localAddresses.Where(localAddress => 
                localAddress.AddressFamily == remoteEndPoint.AddressFamily).ToArray();

        IPAddress selectedLocalAddress = 
            allowedLocalAddresses[random.Next(allowedLocalAddresses.Length)];

        return new IPEndPoint(selectedLocalAddress, 0);
    };

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

引用资料:

编辑:我并不是建议您实际上应该为您的项目随机选择本地地址;上面的代码只是我能想到的最简单的演示。如果您要建立多个并发连接并希望在所有可用适配器之间实现负载平衡最大化,那么您应该循环您的本地地址;这将确保所有适配器处理的连接数量大致相等。

关于c# - 使用多个连接和多宿主下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9181547/

相关文章:

javascript - 远程调试脚本代码VS2010

c# - 如何正确签署可执行文件

android - 通知消失 - Android DownloadManager

c# - 使用 C# 解析 Resx 文件在相对路径上崩溃

c# 正则表达式模式

c - 释放内存——二维数组

android - 如何使用 DownloadManager 将下载的文件存储到分配的应用程序文件目录中?

c# - 通过 C# 在 Excel 中运行 vba 脚本

c# - 使用C#制作Maemo应用程序(代码转QT)

Android 下载管理器 ETag 支持