gpt4 book ai didi

c++ - 从连接管理器获取 wi-fi 连接状态

转载 作者:太空宇宙 更新时间:2023-11-04 13:00:36 25 4
gpt4 key购买 nike

我有一些代码可以成功地遍历 Wi-Fi 网络列表,并提供有关可用网络的反馈。此处显示的基本调用...

WlanOpenHandle(WLAN_API_VERSION, NULL, &dwVersion, &hSession);

PWLAN_INTERFACE_INFO_LIST pInterfaceInfoList = NULL;
WlanEnumInterfaces(hSession, NULL, &pInterfaceInfoList);

for(int i ...)
{
PWLAN_AVAILABLE_NETWORK_LIST pAvailableNetworkList = NULL;
WlanGetAvailableNetworkList(hSession, &interfaceGUID,
WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES |
WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,
NULL, &pAvailableNetworkList);
for(int j ...)
{
WLAN_AVAILABLE_NETWORK network = pAvailableNetworkList->Network[j];
:
}
}

一切正常,在内循环中我可以通过网络数据结构访问我需要的所有属性,例如信号强度、安全标志等。

我无法获得的一件事是有关连接状态的信息,例如 AUTHENTICATING 或 AUTHENTICATION_FAILED 等,因此我尝试在循环内引入另一个调用,如下所示...

CM_CONNECTION_DETAILS connectionDetails;
memset(&connectionDetails, 0, sizeof(CM_CONNECTION_DETAILS));

connectionDetails.Version = CM_CURRENT_VERSION;
const char* ccp = reinterpret_cast<const char*>(network.dot11Ssid.ucSSID);
mbstowcs(connectionDetails.szName, &ccp[0], network.dot11Ssid.uSSIDLength);

DWORD dwCount = sizeof(CM_CONNECTION_DETAILS);

CM_RESULT cmr = CmGetConnectionDetailsByName(connectionDetails.szName,
&connectionDetails, &dwCount);

if (cmr == CMRE_SUCCESS)
{
:
}

调用 CmGetConnectionDetailsByName() 函数后,CM_CONNECTION_DETAILS 结构中的详细信息看起来是正确的(名称和版本),但函数返回 CMRE_INVALID_CONNECTION 且结构未填充。

我无法找到此调用成功的任何示例(只有几个对返回相同 CMRE_INVALID_CONNECTION 代码的调用的引用)。

有没有人有成功使用该调用的经验,或者建议一种更好的方法来找出网络的连接状态(即身份验证是否正在进行或身份验证失败等)?

[我正在使用 Visual Studio 2013 C++( native Windows 应用程序,而非 MFC),目标是 32 位和 Unicode,在 Windows Compact 2013 上运行]

最佳答案

下面的函数并没有完全给我想要的精细控制,但它至少让我有机会找出特定界面的状态。这意味着我可以查明接口(interface)当前是在进行中还是在进行身份验证,并且根据最终状态是连接还是断开,我可以查明身份验证是否成功。

WLAN_INTERFACE_STATE getNetworkState(HANDLE hSession, GUID* pGUID, std::wstring& wsState, bool bReportState=true)
{
WLAN_INTERFACE_STATE result = wlan_interface_state_not_ready;
DWORD dwDataSize;
void* pData;
DWORD dwErrorCode = WlanQueryInterface(hSession, pGUID, wlan_intf_opcode_interface_state, NULL, &dwDataSize, &pData, NULL);
if (dwErrorCode == ERROR_SUCCESS && pData != NULL)
{
WLAN_INTERFACE_STATE* pState = reinterpret_cast<WLAN_INTERFACE_STATE*>(pData);
if (pState != NULL)
{
switch (*pState)
{
case wlan_interface_state_not_ready: wsState = L"NOT_READY"; break;
case wlan_interface_state_connected: wsState = L"CONNECTED"; break;
case wlan_interface_state_ad_hoc_network_formed: wsState = L"AD_HOC_NETWORK_FORMED"; break;
case wlan_interface_state_disconnecting: wsState = L"DISCONNECTING"; break;
case wlan_interface_state_disconnected: wsState = L"DISCONNECTED"; break;
case wlan_interface_state_associating: wsState = L"ASSOCIATING"; break;
case wlan_interface_state_discovering: wsState = L"DISCOVERING"; break;
case wlan_interface_state_authenticating: wsState = L"AUTHENTICATING"; break;
}
result = *pState;
}
WlanFreeMemory(pData);
}
return result;
}

此检查的一个局限性是它不容易支持同一接口(interface)上的多个连接,此查询不允许我们查询状态指的是哪个连接。

如果我找到更好的解决方案,我会在这里报告。

关于c++ - 从连接管理器获取 wi-fi 连接状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44332778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com