在 c# winform 中显示特定的虚拟以太网适配器状态

Display specific virtual ethernet adapter status in c# winform

我正在制作一个简单的应用程序,我只想在单击按钮后显示特定虚拟以太网适配器的状态(这也会提取一些其他信息)。

适配器用于 VPN,始终以“PANGP”开头

目前有以下内容,显然没有选择正确的适配器,但通常会显示网络正常。

            if (NetworkInterface.GetIsNetworkAvailable())
        {
            NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface Interface in interfaces)
            {
                if (Interface.OperationalStatus == OperationalStatus.Up)
                {
                    if ((Interface.NetworkInterfaceType == NetworkInterfaceType.Ppp) && (Interface.NetworkInterfaceType != NetworkInterfaceType.Loopback))
                    {
                        IPv4InterfaceStatistics statistics = Interface.GetIPv4Statistics();
                        vpnStatus.Text = (Interface.Name + " " + Interface.NetworkInterfaceType.ToString() + " " + Interface.Description);
                    }
                    else
                    {
                        vpnStatus.Text = ("Currently not detecting correct adapter but network is up.");
                    }

                }
            }
        }

我不需要任何复杂的东西,只是想显示 PANGP 是禁用还是启用。

这不就是按您要查找的名称过滤网络接口列表的简单情况吗?

像这样:

foreach (NetworkInterface Interface in interfaces.Where(x => x.Name.StartsWith("PANGP")))

这将 return 只有名称以 PANGP 开头的网络接口。

或者如果您不想使用 Linq:

foreach (NetworkInterface Interface in interfaces)
{
    if (Interface.Name.StartsWith("PANGP"))
    {
        ...

解决循环问题

正如@PanagiotisKanavos 在评论中指出的那样,您创建的循环也存在问题。设置 vpnStatus.Text 时显示输出,但将为数组中的每个元素更新输出,只有最后一个元素的值保留在 TextBox.

正确的解决方案取决于何时有多个适配器符合条件或只有一个适配器。

对于单个,只需 select 并且不要使用 foreach 循环:

NetworkInterface Interface = interfaces.Where(x => x.Name.StartsWith("PANGP")).FirstOrDefault();
if (Interface != null)
{
     // Display the appropriate text in your textbox
}

如果有多个,解决方案取决于需要显示的内容。 可以做的是将每个结果存储在字符串中它自己的行中,然后在末尾将 TextBox 设置为该值:

string outputText = string.Empty;

foreach (NetworkInterface Interface in interfaces.Where(x => x.Name.StartsWith("PANGP")))
{
    // Do existing logic and then instead of setting vpnStatus.Text, do this:
    outputText += Interface.Name + " " + Interface.NetworkInterfaceType.ToString() + " " + Interface.Description + Environment.NewLine;
}

vpnStatus.Text = outputText;

.描述或.名称?

要搜索的 属性 实际上可能是 .Description 而不是我上面使用的 .Name。在这种情况下,只需修改 Linq(或非 Linq 的 if 语句)以使用 x.Description.StartsWith("PANGP") 而不是 x.Name....

关于变量名的注意事项

我还礼貌地建议,考虑到与 interface 的交叉,Interface 不是您的变量的理想名称(这就是为什么它可能用大写字母命名的原因)。也许 networkInterface 会更好地服务并减少以后混淆的机会?

在上述帮助下,这最终对我有用:

            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
        NetworkInterface networkInterface = adapters.Where(x => x.Description.StartsWith("PANGP")).FirstOrDefault();
        if (networkInterface != null)
        {
            vpnStatus.Text = "Connected!";
        }