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

时间:2012-02-07 18:14:40

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

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

  1. 将用户想要下载的文件拆分为多个细分。
  2. 对于每个段,DM应该创建一个连接并从服务器请求该段。
  3. 在所有段完成下载后,DM应将这些段组合成一个文件。
  4. 如果存在多宿主,则每个连接都应通过不同的ISP(或使用多路复用,如同使用多宿主,计算机通过多个网络适配器连接到多个ISP),因为此过程应加速文件的下载。
  5. 我可以完成前三个步骤,但我找不到第四步的解决方案,所以任何人都可以请求帮助我或通过正确的方式指导我。

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

1 个答案:

答案 0 :(得分:4)

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

  

某些负载平衡技术要求客户端使用特定的   本地IP地址和端口号,而不是IPAddress.Any(或   互联网协议版本6的IPAddress.IPv6Any和短暂的   港口。您的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();

参考文献:

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