我想设计一个工具,让我选择最强的网络适配器(在速度和带宽方面),并且还想通过该物理适配器路由所有网络流量。
我的方法是:
1.检测适配器并测试它的全速带宽 2.检查每个传入的数据包并通过更改其 IP 标头将其路由到该适配器。
我知道我可以借助 win32 的 IP Helper 类和路由命令。
有没有其他简单的方法来实现这一点。
我想设计一个工具,让我选择最强的网络适配器(在速度和带宽方面),并且还想通过该物理适配器路由所有网络流量。
我的方法是:
1.检测适配器并测试它的全速带宽 2.检查每个传入的数据包并通过更改其 IP 标头将其路由到该适配器。
我知道我可以借助 win32 的 IP Helper 类和路由命令。
有没有其他简单的方法来实现这一点。
一般来说,这并不容易。
带宽检测
.NET 框架提供的类可以为您提供有关网络适配器性能的信息,但据我所知,它们只考虑网卡本身的技术规范,而不是连接的带宽。但是,这可能足以满足您的目的。
如果你想检测连接的带宽,你不仅要观察网络适配器和它的能力,还要观察连接的属性甚至整个基础设施(路由或交换硬件、电缆、流量,利用率等等)。有强大的框架,例如 nagios,可以执行此类监控。
首先,您可以从分析 TCP 连接中的延迟或利用 ICMP 回显(ping)进行测量开始,但请注意,这不是一件容易的事。
路由
由于您无法在 C# 中编写内核模式或驱动程序代码,因此您将通过监视流量并使用 WinPcap 之类的库将网络数据包发送到正确的接口来执行“用户态”路由。(我认为仅仅更改系统路由是不够的,因为您写过要单独路由每个数据包)。
已经有一个名为eEx Network Library的库,它提供了类和基础架构来在 C# 中完成此类任务。还有一个路由示例,您可以将其用作起点。您可以通过从类 Router 或 DirectInterfaceIO 继承来创建自定义路由器,具体取决于最适合您的。
下面是一个例子,可以替换上面例子中的Router类。
//A simple, custom router
public class CustomRouter : DirectInterfaceIOHandler
{
//Is called for each frame - place your logic here.
protected override void HandleTraffic(Frame fInputFrame)
{
//Get the IP frame
//IPv4Frame ipv4frame = GetIPv4Frame(fInputFrame);
IPFrame ipframe = GetIPFrame(fInputFrame);
if (ipframe != null)
{
//Iterate over all interfaces.
foreach (IPInterface ipInterface in lInterfaces)
{
//Adjust this condition to check whether ipInterface is the correct interface for this frame
if (true)
{
//With this overload of send, the interface handles hardware addressing.
ipInterface.Send(fInputFrame, ipframe.DestinationAddress);
}
}
}
}
}