我想设计一个工具,让我选择最强的网络适配器(在速度和带宽方面),并且还想通过该物理适配器路由所有网络流量。
我的方式是:
1.检测适配器并测试其整个速度带宽2.检查每个传入数据包,并通过更改其 IP 标头通过该适配器进行路由。
我知道我可以借助 win32 的 IP 助手类和路由命令。
有没有其他简单的方法来实现这一点。
一般来说,这并不容易。
带宽检测
.NET 框架提供了为您提供有关网络适配器性能信息的类,但据我所知,它们只考虑网卡本身的技术规范,而不是连接的带宽。但是,这可能足以满足您的目的。
如果要检测连接的带宽,不仅要观察网络适配器及其功能,还要观察连接的属性,甚至整个基础结构(路由或交换硬件,电缆,流量,利用率等等)。有一些强大的框架,例如nagios,可以执行这种监控。
在开始之前,您可以从分析 TCP 连接中的延迟或利用 ICMP 回声 (ping) 进行测量开始,但请注意,这不是一件容易的事。
路由
由于您无法用 C# 编写内核模式或驱动程序代码,因此您将通过监视流量并使用 WinPcap 等库将网络数据包发送到正确的接口来执行"用户空间"路由。(我假设仅仅更改系统路由是不够的,因为您写了要单独路由每个数据包)。
已经有一个名为 eEx Network Library 的库,它提供了类和基础结构来完成 C# 中的此类任务。还有一个路由示例,您可以将其用作起点。您可以通过从类 Router 或 DirectInterfaceIO 继承来创建自定义路由器,具体取决于最适合您的类。
下面是一个示例,它可以替换上面提到的示例中的路由器类。
//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);
}
}
}
}
}