【问题标题】:Downloading a file using multiple connections and multihoming使用多个连接和多宿主下载文件
【发布时间】:2012-02-07 18:14:40
【问题描述】:

我是大学四年级的学生。我的毕业项目是一个下载管理器,我打算用 C# 编写代码。 当检查 MSDN 文档时,该项目看起来很简单。但问题是我的老师希望我将多宿主纳入项目。他希望下载管理器:

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

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

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

【问题讨论】:

  • 您正在使用哪些 .NET 类? TcpClient? Socket?还是您正在编写自己的实现?您使用哪种协议进行通信? FTP?
  • 感谢您的帮助 不,我没有使用 Socket 和 TcpClient。我正在使用:System.Net.HttpWebRequest;和 System.Net.HttpWebResponse 我还将使用 FtpWebRequest 和 FtpWebResponse

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


【解决方案1】:

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

某些负载平衡技术要求客户端使用特定的 本地 IP 地址和端口号,而不是 IPAddress.Any(或 IPAddress.IPv6Any 用于 Internet 协议版本 6)和临时 港口。你的BindIPEndPointDelegate可以满足这个要求。

基本上,BindIPEndPointDelegate 允许您选择用于连接的本地端点。您可以使用Dns.GetHostAddresses(Dns.GetHostName()) 检索所有本地 IP 地址的列表,然后在代理中随机选择一个。但是,您需要注意匹配地址族:如果远程端点是 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();

参考资料:

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

【讨论】:

  • 我不确定简单地随机选择一个端点是否是个好主意,可能需要一些更智能的方法。例如,我的计算机有 4 个 IPv4 端点,其中只有一个连接到 Internet。其他三个是连接到虚拟机的虚拟网络。
  • 不,代码只是作为示例给出的。我假设您只会同时下载少量段(可能是 8 个?),在这种情况下,循环浏览可用地址显然比随机选择更合理。
  • 你需要想办法过滤掉你的虚拟网络适配器。
  • @svick:抱歉,刚刚意识到你不是问题发布者。 (我仍然习惯于 SO 上的已建立用户。)您的观点是有效的,但我不知道如何立即解决。
  • @Douglas 先生:非常感谢您的努力我正在测试您的建议,希望它会奏效
猜你喜欢
  • 1970-01-01
  • 2017-05-04
  • 2011-09-14
  • 1970-01-01
  • 2018-03-20
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多