Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用.net编程检测最强的网络适配器(连接)并在检测到的强适配器上路由所有数据_C#_Sockets_Networking_Network Programming_Ip - Fatal编程技术网

C# 如何使用.net编程检测最强的网络适配器(连接)并在检测到的强适配器上路由所有数据

C# 如何使用.net编程检测最强的网络适配器(连接)并在检测到的强适配器上路由所有数据,c#,sockets,networking,network-programming,ip,C#,Sockets,Networking,Network Programming,Ip,我想设计一个工具,让我选择最强大的网络适配器(在速度和带宽方面),并希望通过该物理适配器路由所有网络流量 我的方式是: 1.检测适配器并测试其全速带宽 2.检查每个传入数据包,并通过改变其IP报头将其路由到该适配器上 我知道我可以利用win32的IP助手类和route命令 有没有其他简单的方法可以做到这一点。一般说来,这并不容易 带宽检测 .NETFramework提供了关于网络适配器性能的信息,但据我所知,它们只考虑网卡本身的技术规范,而不考虑连接的带宽。然而,这对于你的目的来说已经足够了

我想设计一个工具,让我选择最强大的网络适配器(在速度和带宽方面),并希望通过该物理适配器路由所有网络流量

我的方式是:

1.检测适配器并测试其全速带宽 2.检查每个传入数据包,并通过改变其IP报头将其路由到该适配器上

我知道我可以利用win32的IP助手类和route命令


有没有其他简单的方法可以做到这一点。

一般说来,这并不容易

带宽检测

.NETFramework提供了关于网络适配器性能的信息,但据我所知,它们只考虑网卡本身的技术规范,而不考虑连接的带宽。然而,这对于你的目的来说已经足够了

如果要检测连接的带宽,不仅要观察网络适配器及其功能,还要观察连接甚至整个基础设施的属性(路由或交换硬件、电缆、通信量、利用率等等)。有一些功能强大的框架,例如nagios,可以执行这种监视

在开始之前,您可以从分析TCP连接中的延迟或利用ICMP回音(ping)进行测量开始,但请注意,这不是一项容易的任务

路由

由于您无法用C#编写内核模式或驱动程序代码,因此必须通过监视通信量并使用WinPcap之类的库将网络数据包发送到正确的接口来执行“userland”路由。(我认为仅仅更改系统路由是不够的,因为您编写了要单独路由每个数据包的代码)

现在已经有一个名为的库,它提供了类和基础结构来用C#完成这些任务。还有一个示例,您可以将其用作起点。您可以通过继承类router或DirectInterfaceIO来创建自定义路由器,具体取决于最适合您的类型

下面是一个示例,它可以替换上述示例中的Router类

//一个简单的自定义路由器
公共类自定义路由器:DirectInterfaceIOHandler
{
//为每个帧调用-将您的逻辑放在此处。
受保护的覆盖无效手动交通(Frame fInputFrame)
{
//获取IP帧
//IPv4Frame IPv4Frame=GetIPv4Frame(fInputFrame);
IPFrame IPFrame=GetIPFrame(fInputFrame);
if(ipframe!=null)
{
//迭代所有接口。
foreach(i接口i过梁面中的接口)
{
//调整此条件以检查i接口是否是此帧的正确接口
如果(真)
{
//通过这种发送重载,接口处理硬件寻址。
i接口.Send(fInputFrame、ipframe.DestinationAddress);
}
}
}
}
}

非常感谢@发射体。我会试试这个。最强的网络适配器可能不是最好的选择。它所连接的网络可能会非常拥挤,从而使另一条路由成为更好的选择。如果存在备用路由,TCP/IP将已经选择路由表中定义的权重最小的路由。你似乎在猜测TCP/IP,或者写一个路由器。买一个。