0

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

编辑

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

4

4 回答 4

1

VPN 试图透明,所以这会很棘手。

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

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

于 2013-04-23T13:37:12.410 回答
1

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

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

于 2013-04-23T13:07:42.857 回答
0

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

我们使用瞻博网络网络连接,我发现当我直接插入网络时它会自行关闭。因此,如果它在那里运行,则很有可能您没有直接连接。如果它没有运行,那么您要么是直接连接的,要么没有使用您的内部服务器。因此,使用这种方法来获取进程列表并检查您的 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();
}
于 2014-08-25T14:51:03.340 回答
0

如果您想要做的主要是关心速度,您可以对 ping 计时。LAN 通常会在很少的几毫秒内做出响应,而 VPN 可能至少需要几十毫秒。

于 2016-08-12T08:42:15.507 回答