Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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将使用哪个NetworkInterface?_C#_.net_Httpclient_Network Interface - Fatal编程技术网

C# 有没有办法指定.net将使用哪个NetworkInterface?

C# 有没有办法指定.net将使用哪个NetworkInterface?,c#,.net,httpclient,network-interface,C#,.net,Httpclient,Network Interface,我想在使用Wifi和LAN连接的设备上运行一系列测试。我有两个网络接口卡,一个是WiFi,另一个是有线的。该设备有一个IP地址,可通过两个网络接口访问。是否有办法确保我的机器使用特定的网络接口,以便我可以通过有线连接运行所有测试,然后通过Wifi连接运行所有测试 请记住,两个连接共享同一子网,因此任何一个都将成功连接到设备。我只想能够来回切换,并指定在任何给定时间使用哪个连接 我正在用C#在.net上使用HttpClient。有没有办法强制HttpClient使用特定的网络接口?它似乎会根据IP

我想在使用Wifi和LAN连接的设备上运行一系列测试。我有两个网络接口卡,一个是WiFi,另一个是有线的。该设备有一个IP地址,可通过两个网络接口访问。是否有办法确保我的机器使用特定的网络接口,以便我可以通过有线连接运行所有测试,然后通过Wifi连接运行所有测试

请记住,两个连接共享同一子网,因此任何一个都将成功连接到设备。我只想能够来回切换,并指定在任何给定时间使用哪个连接

我正在用C#在.net上使用HttpClient。有没有办法强制HttpClient使用特定的网络接口?它似乎会根据IP地址自动选择一个,但在这种情况下,有两个网络接口可以工作。我需要能够通过编程来回切换来运行自动测试

我注意到一种叫做“接口度量”的东西,它可以通过IP4属性高级TCP/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;
                        }
                    }
                }
            }