C# 有没有办法指定.net将使用哪个NetworkInterface?
我想在使用Wifi和LAN连接的设备上运行一系列测试。我有两个网络接口卡,一个是WiFi,另一个是有线的。该设备有一个IP地址,可通过两个网络接口访问。是否有办法确保我的机器使用特定的网络接口,以便我可以通过有线连接运行所有测试,然后通过Wifi连接运行所有测试 请记住,两个连接共享同一子网,因此任何一个都将成功连接到设备。我只想能够来回切换,并指定在任何给定时间使用哪个连接 我正在用C#在.net上使用HttpClient。有没有办法强制HttpClient使用特定的网络接口?它似乎会根据IP地址自动选择一个,但在这种情况下,有两个网络接口可以工作。我需要能够通过编程来回切换来运行自动测试 我注意到一种叫做“接口度量”的东西,它可以通过IP4属性高级TCP/IP设置手动更改。是否每次都会使用编号较小的接口?有没有办法通过编程更改此值C# 有没有办法指定.net将使用哪个NetworkInterface?,c#,.net,httpclient,network-interface,C#,.net,Httpclient,Network Interface,我想在使用Wifi和LAN连接的设备上运行一系列测试。我有两个网络接口卡,一个是WiFi,另一个是有线的。该设备有一个IP地址,可通过两个网络接口访问。是否有办法确保我的机器使用特定的网络接口,以便我可以通过有线连接运行所有测试,然后通过Wifi连接运行所有测试 请记住,两个连接共享同一子网,因此任何一个都将成功连接到设备。我只想能够来回切换,并指定在任何给定时间使用哪个连接 我正在用C#在.net上使用HttpClient。有没有办法强制HttpClient使用特定的网络接口?它似乎会根据IP
更多说明:我没有直接跳到禁用WiFi NIC或有线NIC来回的原因是当您禁用WiFi NIC时,您断开了它所连接的设备,并且当您启用它时,它不会自动重新连接。(即使您说“自动连接”,重新启用时也不会连接)。然而,我找到了一个快速的解决办法。将有线NIC上的接口规格设置为低于WiFi NIC上的接口规格。然后,只需启用和禁用有线NIC。禁用后,系统将使用WiFi NIC。启用后,系统将使用有线NIC,因为其接口度量设置得更低。现在,我只需要弄清楚如何通过编程启用/禁用有线NIC…一种方法是更新路由表,将特定IP的流量强制传输到特定NIC上。路由表用于决定在哪个NIC上发送流量 您可以通过以下两种方式实现此目的: 1) 使用p/Invoke用C#代码更新路由表(请参阅,但基本上您正在调用) 2) 使用
Process.Start
调用route.exe,例如
route.exe ADD destination_network MASK subnet_mask gateway_ip metric_cost
及
最好的方法是使用WinSock绑定: 但一旦bith NIC拥有单一IP,则: 从PowerShell禁用NIC:
从c#调用PowerShell:我最终解决了这个问题,将有线NIC上的接口度量设置为低于Wifi NIC上的接口度量。通过这种方式,我可以简单地禁用和启用有线NIC,这将在测试期间的任何时候有效地更改正在使用的NIC。要禁用NIC,我使用netsh.exe命令和以下代码。“命令”为“启用”或“禁用”,具体取决于我是打开还是关闭它:
System.Diagnostics.Process p = new System.Diagnostics.Process
{
StartInfo =
{
FileName = "netsh.exe",
Arguments = $"interface set interface \"{nicName}\" {command}",
UseShellExecute = false,
RedirectStandardOutput = true
}
};
bool started = p.Start();
您可以使用WlanAPI.cs库
static public void Connect_to_wifi(string ssid)
{
WlanClient client = new WlanClient();
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
// Lists all networks with WEP security
//Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
//foreach (Wlan.WlanAvailableNetwork network in networks)
//{
// if (network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP)
// {
// Console.WriteLine("Found WEP network with SSID {0}.", network.profileName);
// }
//}
// Retrieves XML configurations of existing profiles.
// This can assist you in constructing your own XML configuration
// (that is, it will give you an example to follow).
foreach (Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles())
{
if (profileInfo.profileName == ssid)
{
wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, wlanIface.GetProfileXml(profileInfo.profileName), true);
wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileInfo.profileName);
break;
}
}
}
}
我很好奇你为什么要这样安排?测试有线电视时只需禁用无线,反之亦然。实际上,尽管我不确定为什么两个网络接口只有一个IP,除非你安装了某种桥接适配器,在这一点上,它对客户端应用程序来说应该是透明的,因为它是用于自动测试的。我需要让它在没有用户干预的情况下运行两种风格的测试。我希望能够让它自己运行几天,在适配器之间来回切换,而不会失去连接。这不是正常使用,只是测试将同时使用这两个连接。请澄清,您正在询问如何强制传出流量使用NIC1或NIC2-您不是在谈论传入流量?只是传出流量,我不关心传入流量
static public void Connect_to_wifi(string ssid)
{
WlanClient client = new WlanClient();
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
// Lists all networks with WEP security
//Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
//foreach (Wlan.WlanAvailableNetwork network in networks)
//{
// if (network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP)
// {
// Console.WriteLine("Found WEP network with SSID {0}.", network.profileName);
// }
//}
// Retrieves XML configurations of existing profiles.
// This can assist you in constructing your own XML configuration
// (that is, it will give you an example to follow).
foreach (Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles())
{
if (profileInfo.profileName == ssid)
{
wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, wlanIface.GetProfileXml(profileInfo.profileName), true);
wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileInfo.profileName);
break;
}
}
}
}