c++ - 如何过滤/区分 Windows API NotifyIpInterfaceChange() 捕获的实际事件和 "dummy"事件

标签 c++ winapi service

我需要捕获网络接口(interface)更改,即基于 C++ 的 Windows 服务中的网络连接/断开事件。 Windows API 函数 NotifyIpInterfaceChange () 确实捕获了所有需要的事件,但问题是它还捕获/触发了更多“虚拟”(与任何网络接口(interface)更改无关的事件)事件。并且捕获的额外事件的数量与 MIB_IPINTERFACE_ROW 的值没有任何差异。参数。

根据 this 好像是网速变化引发的事件,但是没有关于速度变化阈值的信息,也无法在引发的事件中检查速度变化。

没有可用于进一步故障排除的一致模式(在额外事件的数量、此事件的时间或触发此额外事件的特定网络连接方面)

在 Windows 服务启动时注册回调的函数 -

bool NetworkInterfaceHelper::initNotification(PVOID Callback,PVOID CallerContext,HANDLE NotificationHandle) {
    PIPINTERFACE_CHANGE_CALLBACK interfaceChangeCallback = (PIPINTERFACE_CHANGE_CALLBACK)Callback;
    return 
        NotifyIpInterfaceChange(
            TARGET_FAMILIY, 
            interfaceChangeCallback, 
            CallerContext, 
            INITIAL_NOTIFICATION,
            &NotificationHandle
        ) == NO_ERROR;
}

我知道可能有其他方法可以使用 C++ 检测网络接口(interface)更改,但我需要修复此问题,如果可能的话,使用现有的代码库。 我提到了I need a event to detect Internet connect/disconnect ,但如果当前用例有可用的修复程序,则需要重新编写代码,这是不可取的。

环境: Windows-7 64 位和 Windows 10 64 位。 C++ Windows 服务。 Visual Studio 2017 社区版。 Windows SDK 版本 10.0.16299.0

最佳答案

在回调函数(MIB_IPINTERFACE_ROW.connected)中过滤/区分它们。

NotifyIpInterfaceChange功能:

registers to be notified for changes to all IP interfaces, IPv4 interfaces, or IPv6 interfaces on a local computer.

关于c++ - 如何过滤/区分 Windows API NotifyIpInterfaceChange() 捕获的实际事件和 "dummy"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54457814/

相关文章:

c++ - 使用 OpenCV 进行面部特征点检测

javascript - 如何将 v8 值转换为数组

Android服务绑定(bind)麻烦

c++ - 检查一个字符串 C++ 中的多个信号

c++ - 在 C++ 中访问传递的结构数组

c++ - 如何将Std::set_terminate与SetUnhandledExceptionFilter一起使用?

java - 从已运行的粘性服务将数据发送到 Activity

grails - 如何获取 grails GSP 标记属性中的本地化消息?

winapi - Lua Alien - 使用 WinAPI 将消息发送到 Notepad.exe

c# - timeBeginPeriod 不适用于 Intel Comet Lake CPU (i5 10400H)