检查是否仅连接到WiFi C#

时间:2016-07-20 13:35:20

标签: c# network-programming

我目前正在使用Managed Wifi API来获取设备所连接的无线网络的SSID。这是我的方法:

public string getSSID() {
    try {
        WlanClient wlan = new WlanClient();
        Collection<String> ConnectedSSIDs = new Collection<string>();

        foreach (WlanClient.WlanInterface wlanInterface in wlan.Interfaces) {
            Wlan.Dot11Ssid ssid = wlanInterface.CurrentConnection.wlanAssociationAttributes.dot11Ssid;
            ConnectedSSIDs.Add(new String(Encoding.ASCII.GetChars(ssid.SSID, 0, (int)ssid.SSIDLength)));
        }
        return ConnectedSSIDs[0];
    } catch (Win32Exception) {
        return EMPTY;
    } catch (Exception Ex) {
        throw Ex;
    }
}

目前,我可以确定是否连接到Wifi和以太网(因为SSID在这种情况下仍然存在)或者只是以太网。

我想以某种方式扣除我是否只是连接到Wifi而不是以太网。
我已经看过了:

  1. Win32_NetworkAdapterConfiguration
  2. Win32_NetworkAdapter
  3. 令人惊讶的是,查看 Win32_NetworkAdapter AdapterType 属性(当只连接到Wifi时)我仍然返回&#34;以太网802.3&#34; < / em>而不是&#34;无线&#34; 这是我所期望的。
    不幸的是,我认为 Managed Wifi API 中有一种方法可以实现我的目标。

    修改

    所以我定义了这3个常量:

    private const string WIFI_AND_ETHERNET = "WIFI & ETHERNET";
    private const string WIFI = "WIFI";
    private const string ETHERNET = "ETHERNET";
    

    目前,我上面显示的方法可以扣除网络连接是ETHERNET还是WIFI_AND_ETHERNET。 它通过检查SSID是否可用/可以看到来完成此操作。如果是,那么它将返回WIFI_AND_ETHERNET,但如果没有,则只返回ETHERNET

    现在我需要一种方法来区分网络连接是通过WIFI 还是WIFI_AND_ETHERNET

2 个答案:

答案 0 :(得分:1)

尝试这样。

 var process = new Process
        {
            StartInfo =
                      {
                          FileName = "netsh.exe",
                          Arguments = "wlan show interfaces ",
                          UseShellExecute = false,
                          RedirectStandardOutput = true,
                          CreateNoWindow = true
                      }
        };
        process.Start();

        var output = process.StandardOutput.ReadToEnd();

        var lanProcess = new Process
        {
            StartInfo =
                      {
                          FileName = "netsh.exe",
                          Arguments = "interface show interface name=\"Ethernet\" ",
                          UseShellExecute = false,
                          RedirectStandardOutput = true,
                          CreateNoWindow = true
                      }
        };
        lanProcess.Start();
        var lanOutput = lanProcess.StandardOutput.ReadToEnd();
        var lanState = lanOutput.Split(new[] { Environment.NewLine },StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(l => l.Contains("Connect state"));
        var wlanState = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(l => l.Contains("State"));
        if (!wlanState.Contains("disconnected")&&lanState.Contains("Disconnected"))

        {
            Console.WriteLine("Wi-Fi");
        }
        else if(wlanState.Contains("disconnected") && !lanState.Contains("Disconnected"))
        {
            Console.WriteLine("Ethernet");
        }
        else if (!wlanState.Contains("disconnected") && !lanState.Contains("Disconnected"))
        {
            Console.WriteLine("Wi-Fi & Ethernet");
        }
        else
        {
            Console.WriteLine("Not connected");
        }
        Console.Read();

答案 1 :(得分:0)

试试这样。

 var process = new Process
        {
            StartInfo =
                      {
                          FileName = "netsh.exe",
                          Arguments = "wlan show interfaces",
                          UseShellExecute = false,
                          RedirectStandardOutput = true,
                          CreateNoWindow = true
                      }
        };
        process.Start();

        var output = process.StandardOutput.ReadToEnd();
        var state = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(l => l.Contains("State"));
        if (!state.Contains("disconnected"))
        {
            Console.WriteLine("Wi-Fi");
        }
        else
        {
            Console.WriteLine("Ethernet");
        }
        Console.Read();