我是大学四年级的学生。我的毕业设计是一个下载管理器,我打算用C#编写它。当查看MSDN文档时,该项目看起来很容易。但问题是,我的老师希望我将多主页纳入这个项目。他希望下载管理器:
- 将用户想要下载的文件拆分为多个段
- 对于每个分段,DM应当创建连接并向服务器请求该分段
- 在所有分段完成下载之后,DM应当将这些分段组合成一个文件
- 如果存在多宿,每个连接都应该通过不同的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)
编辑:我并不是建议你应该为你的项目随机选择本地地址;上面的代码只是我能想到的最简单的演示。如果您正在建立多个并发连接,并希望在所有可用适配器之间最大限度地实现负载平衡,那么您应该通过本地地址循环;这将确保所有适配器处理的连接数量大致相等。