【问题标题】:How to filter/differentiate between actual and "dummy" events captured by the Windows API NotifyIpInterfaceChange()如何过滤/区分由 Windows API NotifyIpInterfaceChange() 捕获的实际事件和“虚拟”事件
【发布时间】:2019-06-24 18:00:59
【问题描述】:

我需要捕获网络接口更改,即基于 C++ 的 Windows 服务中的网络连接/断开连接事件。 Windows API 函数NotifyIpInterfaceChange() 确实捕获了所有需要的事件,但问题是它还捕获/触发了更多“虚拟”(与任何网络接口更改无关的事件)事件。并且捕获的额外事件数量与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++ 检测网络接口更改的替代方法,但如果可能,我需要使用现有代码库来解决此问题。 我已经提到了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

【问题讨论】:

    标签: c++ winapi service


    【解决方案1】:

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

    NotifyIpInterfaceChange 函数:

    注册以收到关于所有 IP 接口、IPv4 更改的通知 接口,或本地计算机上的 IPv6 接口。

    【讨论】:

    • 这个API会通知网卡的添加和移除吗?
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多