以编程方式检测VPN连接(c ++)

时间:2013-04-23 12:57:56

标签: c++ network-programming vpn

好的,这是交易。我正在开发一个程序,需要确定用户是通过VPN连接还是直接连接到特定的LAN。如果它连接到LAN,它需要做一些事情。如果它是“离线”(意味着它没有连接到LAN,但可以连接到Internet),则需要执行其他操作。有关如何在c ++中执行此操作的任何想法?是否有API调用来检查网络连接是否是VPN连接?我正在寻找像“IsVPNConnection(...)”这样的东西。

编辑

我使用的操作系统是Windows 7.我正在寻找一种独立于VPN类型的解决方案。

4 个答案:

答案 0 :(得分:1)

根据您所连接的位置(LAN / VPN),您可以访问不同的网络资源(服务器)。我最好的选择是ping( ICMP echo )这些服务器或以其他方式尝试访问他们托管的服务,并猜测根据成功/失败连接到哪个网络。如何做到这完全取决于您的操作系统,正如@PaulR所提到的那样。

涉及枚举网络连接,路由表等的任何其他解决方案很可能更加复杂且容易出错,因此我完全避免这种情况,并采用我提到的简单服务检测。

答案 1 :(得分:1)

VPN尝试透明,因此这很棘手。

大多数机器只有一条到其他机器的路线。使用VPN可能有两条路由。所以你可以查看路由表。有些VPN客户端会禁用本地网络,因此您将返回到一条路由。

如果您可以告诉您的程序本地子网上的IP地址,那么很容易。

答案 2 :(得分:0)

我试图确定同样的事情,这是我得到的最接近的事。

我们使用瞻博网络Network Connect,我已经看到当我直接插入网络时它会自行关闭。因此,如果它在那里运行很有可能你没有直接连接。如果它没有运行,那么您要么直接连接,要么不使用内部服务器。因此,使用此方法获取进程列表并检查您的VPN进程,结合上述仅在公司网络中可用的ping服务器的方法可能会给您带来可靠的结果。我用这段代码来测试我的VPN进程。这是CLR,不确定你是否会使用.Net资源......

#include "stdafx.h"

#using <mscorlib.dll>
#using <System.dll>

using namespace System;
using namespace System::Diagnostics;
using namespace System::ComponentModel;

int main() {
    System::String ^procName = "dsNetworkConnect";

    array<System::Diagnostics::Process^>^matches =
        System::Diagnostics::Process::GetProcessesByName(procName);

    if (matches->Length > 0)
        System::Console::WriteLine("Process " + matches[0]->ProcessName + 
           " found - do something");
    else
        System::Console::WriteLine("Process not found, do something else.");
    System::Console::ReadKey();
}

答案 3 :(得分:0)

如果您想要做的事情主要是关注速度,那么您可以计时。局域网通常在很少的MS中响应,而VPN可能至少在几十毫秒内响应。