从连接管理器中获取Wi-Fi连接状态
Obtaining wi-fi connection status from Connection Manager
我有一些代码,可以在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];
:
}
}
这一切都很好,在内部循环中,我可以通过网络数据结构访问我需要的所有属性,例如信号强度,安全标志等。
我无法获得的一件事是有关连接状态的信息,例如身份验证或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 (本机Windows App,而不是MFC(,目标是32位和Unicode,在Windows Compact上运行,2013年]
下面的功能并不能完全给我我想要的良好控制,但是它至少使我有机会找到一个特定的接口。这意味着我可以找出界面当前正在流程中还是对验证,具体取决于最终状态是连接还是断开连接,我可以找出身份验证是否成功。
。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;
}
此检查的一个限制是,它不容易支持同一接口上的多个连接,此查询不允许我们查询状态所指的哪个连接。
如果我得出更好的解决方案,我将在此处报告。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 在 libcurl 连接池中预创建连接
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 通过TCP连接到Wi-Fi上的0.0.0.0,而侦听器PC有活动的Wi-Fi,以太网没有'不起作用
- 瓶颈 C++ 排序函数Wi-Fi 信号
- 从连接管理器中获取Wi-Fi连接状态
- Connect to Wi-Fi C++
- 是否可以在 Windows C++ 中以编程方式检查我的笔记本电脑是通过 Wi-Fi 还是通过"wired LAN"连接的?