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



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

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

我可以完成前三步,但我找不到第四步的解决方案,所以任何人都可以帮助我或引导我走正确的路。

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

我相信您的答案在于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();

参考文献:

  • 如何在HttpWebRequest中更改始发IP
  • 选择HTTP请求在具有多个IP时使用的IP(.NET)

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

相关内容

  • 没有找到相关文章

最新更新