如何确定c#中的dns变化?

我想监视dns地址的变化。 所以我需要跟踪dns的变化。 我正在用线程做它现在。 我得到dns并保存文件,然后我每10秒比较一次,但我需要更具体的解决方案。 例如,那有什么事吗? 这是代码:

GetDns:

public List GetDns() { List dns = new List(); NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface networkInterface in networkInterfaces) { if (networkInterface.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties ipProperties = networkInterface.GetIPProperties(); IPAddressCollection dnsAddresses = ipProperties.DnsAddresses; foreach (IPAddress dnsAdress in dnsAddresses) { dns.Add(dnsAdress.ToString()); } } } return dns; } 

这是比较:

 string[] xmlDns = xmlData.GetDatas("DNSs", "Dns"); List dns = getData.GetDns(); for (int i = 0; i < xmlDns.Length; i++) { if ( xmlDns[i].Equals( dns[i])) { this.Invoke(new MethodInvoker(delegate() { listBoxCheck.Items.Add(xmlDns[i] + " DNS was not changed."); })); } else { this.Invoke(new MethodInvoker(delegate() { listBoxCheck.Items.Add(xmlDns[i] + " DNS adress was changed as " + dns[i] ); })); } } 

DNS是基于请求的。 DNS服务器到客户端没有任何事件。 您可以使用TTL(生存时间)元数据,该元数据会告诉您DNS记录何时到期。

这是一个库,它公开API来查询给定的dns服务器SimpleDNS和获取TTL值的文档。

您可以使用WMI查询来查询DNS。 循环查询并将返回的结果与先前的结果进行比较。 当值发生更改(或触发您的事件或其他内容)时弹出消息框。

您必须使用System.Management命名空间才能完成此操作,或者管理命名空间可能包含查看dns的function。 但我不确定这一点。

这并不完全正确,因为@Candide写道DNS中没有事件 。 特别是对于变更通知。

如果您控制DNS服务器,则可以将其设置为作为客户端向您发送NOTIFY消息。 只要权威DNS服务器希望从属服务器更新区域内容,就会发送(不保证,但最常见)此类消息。 然后你可以以任何你喜欢的方式对这些做出反应。 大多数DNS服务器实现可能默认只将NOTIFY消息发送到列出的名称服务器,但也可以配置为将它们发送到其他主机(例如,在BIND 9中,这是使用区域配置中的also-notify {}指令完成的)。

我不确定你会如何实现它; NOTIFY是DNS协议的一部分,因此您实际上是在编写一个有限用途的DNS服务器实现来监听并处理这些消息。 您至少需要监视UDP和TCP上的端口53(我确实认为通知几乎总是在UDP上发送,但标准也允许TCP传输),整理收到的任何NOTIFY消息,并采取行动他们。

此外,由于无法保证交付,您还需要一个回退机制。

这是否可行,完全取决于具体情况。