好的,这是交易。我正在开发一个程序,需要确定用户是通过 VPN 连接还是直接连接到特定 LAN。如果它连接到局域网,它需要做一些事情。如果它是“离线”的(意味着它没有连接到局域网,但可以连接到互联网),它需要做其他事情。关于如何在 C++ 中执行此操作的任何想法?是否有 API 调用来检查网络连接是否为 VPN 连接?我正在寻找类似“IsVPNConnection(...)”的东西。
编辑
我使用的操作系统是 Windows 7。我正在寻找一种独立于 VPN 类型的解决方案。
好的,这是交易。我正在开发一个程序,需要确定用户是通过 VPN 连接还是直接连接到特定 LAN。如果它连接到局域网,它需要做一些事情。如果它是“离线”的(意味着它没有连接到局域网,但可以连接到互联网),它需要做其他事情。关于如何在 C++ 中执行此操作的任何想法?是否有 API 调用来检查网络连接是否为 VPN 连接?我正在寻找类似“IsVPNConnection(...)”的东西。
编辑
我使用的操作系统是 Windows 7。我正在寻找一种独立于 VPN 类型的解决方案。
VPN 试图透明,所以这会很棘手。
大多数机器只有一条通往其他机器的路线。使用 VPN 可能有两条路线。所以你可能会检查路由表。一些 VPN 客户端禁用本地网络,因此您将只返回一个路由。
如果您可以告诉您的程序本地子网上的 IP 地址,那么这很容易。
根据您连接的位置(LAN / VPN),您将可以访问不同的网络资源(服务器)。我最好的选择是 ping ( ICMP echo ) 这些服务器或尝试访问它们托管的服务,并根据成功/失败猜测您连接到哪个网络。正如@PaulR 提到的,如何做到这一点完全取决于您的操作系统。
涉及枚举网络连接、路由表等的任何其他解决方案很可能要复杂得多且容易出错,所以我会完全避免这种情况,并使用我提到的简单服务检测。
我试图确定同样的事情,这是我得到的最接近的。
我们使用瞻博网络网络连接,我发现当我直接插入网络时它会自行关闭。因此,如果它在那里运行,则很有可能您没有直接连接。如果它没有运行,那么您要么是直接连接的,要么没有使用您的内部服务器。因此,使用这种方法来获取进程列表并检查您的 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();
}
如果您想要做的主要是关心速度,您可以对 ping 计时。LAN 通常会在很少的几毫秒内做出响应,而 VPN 可能至少需要几十毫秒。