我想使用其Wifi和LAN连接在设备上运行一系列测试。我有两个网络接口卡,一个是WiFi,另一个是有线的。该设备具有可通过两个网络接口访问的单个IP地址。有没有办法保证我的机器使用特定的网络接口,以便我可以通过有线连接运行所有测试,然后通过Wifi连接运行所有测试?
请记住,两个连接共享同一个子网,因此要么成功连接到设备。我只是希望能够来回切换并指定我在任何给定时间使用的连接。
我在.net上使用HttpClient和C#。有没有办法强制HttpClient使用特定的网络接口?它似乎根据IP地址自动选择一个,但在这种情况下,有2个网络接口可以工作。我需要能够以编程方式来回切换以运行我的自动化测试。
我注意到了一种称为“接口度量”的东西,可以通过IP4属性高级TCP / IP设置手动更改。每次都会使用编号较小的接口吗?有没有办法以编程方式更改此值?
更多澄清:我没有直接跳转到禁用WiFi NIC或有线网卡来回的原因是当您禁用WiFi网卡时,断开连接的设备并且它不会自动重新连接你启用它。 (即使您说'自动连接',重新启用时也不会连接)。但是,我找到了一个快速解决方案。将有线NIC上的Interface Metric设置为低于WiFi NIC上的Interface Metric。然后,只需启用和禁用有线NIC。禁用时,系统将使用WiFi NIC。启用后,系统将使用有线NIC,因为其接口度量标准设置得较低。现在,我只需要弄清楚如何以编程方式启用/禁用有线网卡...
答案 0 :(得分:2)
您可以使用库 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;
}
}
}
}
答案 1 :(得分:1)
一种方法是更新路由表以强制特定IP到特定NIC的流量。路由表用于决定发送流量的NIC。
你可以通过以下两种方式实现这一目标:
1)使用P / Invoke用C#代码更新路由表(参见here for a good example,但基本上你正在调用CreateIpForwardEntry)。
2)使用Process.Start
来调用route.exe,例如
route.exe ADD destination_network MASK subnet_mask gateway_ip metric_cost
和
route.exe CHANGE destination_network MASK subnet_mask gateway_ip metric_cost
答案 2 :(得分:1)
最好的方法是使用WinSock绑定:TCP/IP connection on a specific interface
但是,如果您拥有bith NIC的单个IP,那么:
从PowerShell中禁用NIC:https://docs.microsoft.com/en-us/powershell/module/netadapter/disable-netadapter?view=win10-ps
从c#调用PowerShell:https://blogs.msdn.microsoft.com/kebab/2014/04/28/executing-powershell-scripts-from-c/
答案 3 :(得分:0)
我最终通过将有线NIC上的Interface Metric设置为低于Wifi NIC上的Interface Metric来解决此问题。通过这种方式,我能够简单地禁用并启用有线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();