【问题标题】:Windows API for DNS change notification用于 DNS 更改通知的 Windows API
【发布时间】:2020-10-07 23:18:45
【问题描述】:

我正在寻找一种在网络接口的已配置 DNS 服务器地址发生更改时使用本机 Windows API (C/C++) 接收通知的方法。出于性能和反应时间的原因,我显然希望避免轮询。

例如,Iphlpapi.dll 中有 NotifyIpInterfaceChange API。在我的测试中,当主机的 IP 地址、子网掩码或默认网关发生变化时,它会可靠地触发通知,但仅当 DNS 地址发生变化时根本不会触发。

到目前为止,我唯一的“解决方案”是使用 WMI 事件查询,但它实际上是在后台轮询,因此为了避免占用系统,需要将轮询间隔(WQL WITHIN 子句)设置为几个秒,这导致我的应用程序出现长时间且烦人的延迟。另外,出于各种原因(这不是本次讨论的主题),我更愿意避免使用 WMI,只有在没有其他方法时才使用它。

【问题讨论】:

  • HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces[\interface-name] 上调用RegNotifyChangeKeyValue 的最小可能性是多少,因为当DNS 服务器更改时此密钥将被更改-NameServerDhcpNameServer
  • 好主意。我研究了一下,它应该可以工作。我绝对可以将其视为可接受的解决方案。我只是想知道这是否是唯一的方法?它肯定比 WMI 恕我直言。
  • 如果这是唯一的方法?不知道。可能存在和更好的解决方案/ api,但我不知道这一点。比 WMI 更好 - 是的,100%
  • 是的,我的意思是,如果有人提出更好的主意,我会再等一会儿。与此同时,如果你把你的答案放在答案而不是评论中,我会很乐意支持它。如果没有更好的结果,我会很乐意接受它作为答案。
  • @RbMm:我愿意接受您的建议作为解决方案。你能把它变成一个答案吗?然后你会得到它的积分。

标签: c++ c winapi network-programming


【解决方案1】:

这个答案的实际功劳应该归于 RbMm,但他没有发布答案,而且似乎已经离开了 MIA。

要接收 DNS 更改通知,唯一的非轮询解决方案似乎是使用 RegNotifyChangeKeyValue WinApi 来监视 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip[6]\Parameters\Interfaces 键下的更改。请注意,IPv4 和 IPv6 分别有单独的 Tcpip 和 Tcpip6 密钥。无论如何,自最初的建议以来,我已经实施并彻底测试了该解决方案,并且它可以正常工作。

半相关警告:RegNotifyChangeKeyValue 有其非直观的特性,并且与大多数其他通知 API 不同,因此请务必研究其文档。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多