我正在寻找一种使用本机Windows API(C / C++)来在网络接口(interface)的已配置DNS服务器地址发生更改时接收通知的方法。由于性能和反应时间的原因,我显然希望避免轮询。
例如,NotifyIpInterfaceChange中有 Iphlpapi.dll API。在我的测试中,当主机的IP地址,子网掩码或默认网关更改时,它将可靠地触发通知,而仅DNS地址更改时,则完全不会触发通知。
到目前为止,我唯一的“解决方案”是使用WMI事件查询,但是它实际上是在后台进行轮询,因此,为了避免占用系统资源,需要将轮询间隔(WQL WITHIN子句)设置为几秒钟,从而导致对我的申请造成了漫长而烦人的延迟。另外,由于各种原因(这不是本讨论的主题),我还是希望避免使用WMI,仅在没有其他方法时才诉诸WMI。

最佳答案

该答案的实际功劳应该归功于RbMm,但他没有发布答案,而且似乎已经取消了MIA。
为了接收DNS更改通知,唯一的非轮询解决方案似乎是使用RegNotifyChangeKeyValue WinApi监视HKLM\SYSTEM\CurrentControlSet\Services\Tcpip[6]\Parameters\Interfaces密钥下的更改。请注意,分别为IPv4和IPv6提供了单独的Tcpip和Tcpip6密钥。无论如何,自最初的建议以来,我已经实现并彻底测试了该解决方案,并且该解决方案没有任何问题。
一个半相关的警告:RegNotifyChangeKeyValue具有非直观的特性,它不同于大多数其他通知API,因此请务必研究其文档。

10-06 14:33
查看更多