托管连接管理器包装器以及如何绕过连接计划程序






4.33/5 (11投票s)
本文介绍如何绕过连接规划器,并使用 Windows Mobile 设备上的连接管理器 API 建立连接。
引言
本文介绍如何绕过连接规划器,并使用 Windows Mobile 设备上的连接管理器 API 建立连接。创建了一个新的应用程序块 Connection Manager,其中包含一个指向 Windows Mobile 设备上连接管理器原生 API 的包装器。此外,还增强了 Microsoft Patterns & Practices 组提供的 ConnectionMonitor
应用程序块,以检索设备上所有可用的连接。
Windows Mobile 中的连接管理器是什么?
连接管理器(您可以通过实现 Connection Manager API 来实现)集中并自动化了从 Windows Mobile 设备连接到 Internet 或企业网络的应用程序的各种网络连接的建立和管理。当一个或多个应用程序请求连接时,连接管理器会使用最佳连接类型建立连接,并通知所有应用程序连接已激活。应用程序被配置为指定连接名称和网络名称。
连接管理器会跟踪哪些连接正在被使用或被应用程序请求。它会关闭未使用的连接,在连接空闲达到指定时间后自动断开连接,并关闭低优先级连接以打开高优先级连接。例如,语音连接通常比数据连接具有更高的优先级。
连接管理器支持多种不同类型的连接,包括点对点协议 (PPP)、远程访问服务 (RAS) 和点对点隧道协议 (PPTP) 连接。连接管理器还可以配置代理服务器设置,以允许通过防火墙或无线应用协议 (WAP) 网关访问网络资源。
连接监视器应用程序块
此应用程序块由 Microsoft Patterns & Practices 组提供。此应用程序块允许您的应用程序检索移动设备的连接信息并监视连接状态的变化。
连接管理器功能
连接管理器 API 包含大约 11 个函数,但您只需要其中两个函数即可了解连接状态。
函数 | 描述 |
|
此函数枚举可用网络。 |
|
此函数返回有关 Windows Mobile 设备上现有数据连接的详细信息。 |
连接管理器应用程序块
此应用程序块提供托管 API,用于从移动设备建立或释放连接。此应用程序块弥合了托管代码的差距,允许用户管理他们的连接。
连接管理器功能
连接管理器 API 包含大约 11 个函数,但您只需要其中六个函数即可完成建立和释放网络连接的任务。在许多情况下,您的应用程序可能只需要两个函数。下表显示了六个函数
函数 | 描述 |
|
检索指定 URL 的网络标识符(Internet 或 Work)。 |
|
选择并建立指定网络标识符的适当连接。此方法在不等待连接尝试完成的情况下返回;使用 |
|
选择并建立指定网络标识符的适当连接。此方法在连接尝试完成之前不会返回。 |
|
释放指定的连接,这可能会关闭该连接。 |
|
检索指定连接的状态。 |
|
此函数将连接引用映射到其对应的 GUID。此函数通过显式提供将映射到连接的 GUID 来允许您绕过连接规划器。 |
Using the Code
显示连接状态
CMConsole 是一个示例代码,展示了用户如何使用 **Connection Monitor** 和 **Connection Manager** 应用程序块。Connection Monitor 示例的这部分由 Microsoft Patterns & Practices 组提供,并已得到增强,以展示我们如何使用 **Connection Manager** 应用程序块来建立连接。
public ConsoleForm()
{
InitializeComponent();
monitor = ConnectionMonitorFactory.CreateFromConfiguration();
monitor.ActiveNetworkChanged += NetworkChangeHandler;
}
控制台屏幕显示 app.config 中定义的各种连接:蜂窝连接、NIC 连接和桌面连接。ConnectionMonitorFactory.CreateFromConfiguration()
返回一个 ConnectionMonitor
对象,该对象跟踪配置文件中指定的各种连接的状态。
ConnectionMonitorFactory
对象(monitor)从 app.config 文件中检索要监视的连接列表。内部,此对象为这些连接中的每一个注册 SystemProperty
。ActiveNetworkChanged
事件指示任何一个连接状态已更改,以便我们可以更新连接列表。
绕过连接规划器
在 ConnectionList 屏幕中,实现了我们如何在此代码示例中绕过连接规划器。它还解释了我们如何使用 Connection Manager 应用程序块。ConnectionMonitorNativeHelper.GetConnectionList()
检索设备上所有可用的连接。下面屏幕中显示了它们。我们可以选择一个特定连接,例如“MY GPRS Connection”,然后在示例中选择“Connect”菜单以连接到选定的连接。
注意:您可以在 WM 6.0 设备模拟器上创建新的 GPRS 连接,并使用蜂窝模拟器进行测试。
private void mnuConnect_Click(object sender, EventArgs e)
{
const int CONNMONITOR_STATUS_CONNECTED = 0x10;
ConnectionMonitorNativeHelper.CONNMONITOR_CONNECTION_DETAILED_STATUS cnStatus =
cnList[lstConnection.SelectedIndex];
if (_connectionHandle != IntPtr.Zero)
{
ConnMgrReleaseConnection(_connectionHandle, 0);
_connectionHandle = IntPtr.Zero;
}
if (cnStatus.dwConnectionStatus != CONNMONITOR_STATUS_CONNECTED)
{
ConnMgrStatus status = ConnMgrStatus.Unknown;
Guid forceConnGuid = new Guid();
if (ConnMgrMapConRef(ConnMgrConRefTypeEnum.ConRefType_NAP,
cnStatus.pszDescription, ref forceConnGuid) != 0)
{
ConnMgrMapConRef(ConnMgrConRefTypeEnum.ConRefType_PROXY,
cnStatus.pszDescription, ref forceConnGuid);
}
ConnMgrConnectionInfo info = new ConnMgrConnectionInfo(forceConnGuid,
ConnMgrPriority.HighPriorityBackground);
ConnMgrEstablishConnectionSync(info, ref _connectionHandle,
_syncConnectTimeout, ref status);
if (status == ConnMgrStatus.Connected)
MessageBox.Show("Connect Succeeded");
else
MessageBox.Show("Connect failed: " + status.ToString());
}
}