Windows API 用于 DNS 更改通知
Windows API for DNS change notification
我正在寻找一种方法,以便在网络接口的已配置 DNS 服务器地址发生更改时接收通知,使用本机 Windows APIs (C/C++)。出于性能和反应时间的原因,我显然希望避免轮询。
例如Iphlpapi.dll
中的NotifyIpInterfaceChange
API。在我的测试中,当主机的 IP 地址、子网掩码或默认网关发生变化时,它会可靠地触发通知,但当只有 DNS 地址发生变化时,它根本不会触发通知。
到目前为止,我唯一的“解决方案”是使用 WMI 事件查询,但它实际上是在后台轮询,因此为避免占用系统,轮询间隔(WQL WITHIN
子句)需要设置为几秒钟,这会导致我的应用程序出现漫长而烦人的延迟。此外,出于各种原因(这不是本次讨论的主题),我宁愿避免使用 WMI,只有在没有其他方法时才使用它。
这个答案的实际功劳应该归功于 RbMm,但他没有发布答案而且似乎已经消失了。
要接收 DNS 更改通知,唯一的 non-polling 解决方案似乎是使用 RegNotifyChangeKeyValue
WinApi 来监视 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip[6]\Parameters\Interfaces
键下的更改。请注意,IPv4 和 IPv6 分别有单独的 Tcpip 和 Tcpip6 密钥。无论如何,自最初的建议以来,我已经实施并彻底测试了该解决方案,并且它没有问题。
一个 semi-related 警告:RegNotifyChangeKeyValue
有其 non-intuitive 的特点,它与大多数其他通知 API 不同,所以一定要研究它的文档。
我正在寻找一种方法,以便在网络接口的已配置 DNS 服务器地址发生更改时接收通知,使用本机 Windows APIs (C/C++)。出于性能和反应时间的原因,我显然希望避免轮询。
例如Iphlpapi.dll
中的NotifyIpInterfaceChange
API。在我的测试中,当主机的 IP 地址、子网掩码或默认网关发生变化时,它会可靠地触发通知,但当只有 DNS 地址发生变化时,它根本不会触发通知。
到目前为止,我唯一的“解决方案”是使用 WMI 事件查询,但它实际上是在后台轮询,因此为避免占用系统,轮询间隔(WQL WITHIN
子句)需要设置为几秒钟,这会导致我的应用程序出现漫长而烦人的延迟。此外,出于各种原因(这不是本次讨论的主题),我宁愿避免使用 WMI,只有在没有其他方法时才使用它。
这个答案的实际功劳应该归功于 RbMm,但他没有发布答案而且似乎已经消失了。
要接收 DNS 更改通知,唯一的 non-polling 解决方案似乎是使用 RegNotifyChangeKeyValue
WinApi 来监视 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip[6]\Parameters\Interfaces
键下的更改。请注意,IPv4 和 IPv6 分别有单独的 Tcpip 和 Tcpip6 密钥。无论如何,自最初的建议以来,我已经实施并彻底测试了该解决方案,并且它没有问题。
一个 semi-related 警告:RegNotifyChangeKeyValue
有其 non-intuitive 的特点,它与大多数其他通知 API 不同,所以一定要研究它的文档。