我怎么知道是否建立了VPN连接?

时间:2012-09-01 12:04:55

标签: c# network-programming vpn

我有一个VPN连接,为了建立VPN连接,必须执行一个PPTP.bk文件,运行此文件并输入凭据后,建立VPN连接。 我试图以编程方式连接和断开VPN连接。 问题是窗口中没有创建VPN连接,因此我需要能够随时验证任何VPN连接,如果不存在则建立一个。

6 个答案:

答案 0 :(得分:17)

我使用NetworkInterface类检查VPN连接状态。以下是我为此目标编写的代码:

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();
                MessageBox.Show(Interface.Name + " "  + Interface.NetworkInterfaceType.ToString() + " " + Interface.Description);
            }
            else
            {
                MessageBox.Show("VPN Connection is lost!");
            }
        }
    }
}

答案 1 :(得分:3)

查看此代码以维护VPN connection programmatically

TestConnection 功能(每15秒调用一次)中,ping请求被发送到IP地址以检查连接是否存活。

答案 2 :(得分:2)

稍作修改 - 这是适合我的代码。

public bool CheckForVPNInterface()
    {
        if (NetworkInterface.GetIsNetworkAvailable())
        {
            NetworkInterface[] interfaces = 
NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface Interface in interfaces)
            {
                // This is the OpenVPN driver for windows. 
                if (Interface.Description.Contains("TAP-Windows Adapter")
                  && Interface.OperationalStatus == OperationalStatus.Up)
                {
                        return true;
                }
            }
        }
        return false;
    }

答案 3 :(得分:0)

在我的网络驱动程序上,描述文本中有Cisco。这是仅几行的最新版本:

public static class VPNCheck
{
    public static bool IsOn()
    {
        return ((NetworkInterface.GetIsNetworkAvailable())
                && NetworkInterface.GetAllNetworkInterfaces()
                                   .FirstOrDefault(ni => ni.Description.Contains("Cisco"))?.OperationalStatus == OperationalStatus.Up);
    }
}

答案 4 :(得分:0)

对我来说,这很有用,但是我想在遍历所有接口并找到一个UP后检查特定的VPN名称...

            if (NetworkInterface.GetIsNetworkAvailable())
            {
                NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface Interface in interfaces)
                {
                    if (Interface.OperationalStatus == OperationalStatus.Up)
                    {
                        if (Interface.Description.Contains("VPN_Name"))
                        {
                            connected = true;
                            break;
                        }                           
                    }
                }
            }

答案 5 :(得分:-1)

如果存在VPN连接且连接正常,您将始终找到一个名为“ tun0 ”的网络接口。因此,使用NetworkInterface的相同方法,我编写了一个简单的代码:

public static boolean isVpnOk(){
    List<String> networks = new ArrayList<>();
    try {
        for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
            if (networkInterface.isUp()) networks.add(networkInterface.getName());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return networks.contains("tun0");
}