C# Dns.GetHostEntry 没有 return 连接到 WiFi 的移动设备的名称

C# Dns.GetHostEntry doesn't return names of mobile devices connected to WiFi

我在 C# 中有一个 windows 表单应用程序,我正在尝试获取列表中所有客户端的主机名。下面给出的是 ra00l 来自 link 的代码示例:GetHostEntry is very slow(我编写了类似的代码,但这个代码更清晰)

private delegate IPHostEntry GetHostEntryHandler(string ip);
public string GetReverseDNS(string ip, int timeout) 
{
     try
     {
          GetHostEntryHandler callback = new GetHostEntryHandler(Dns.GetHostEntry);
          IAsyncResult result = callback.BeginInvoke(ip,null,null);
          if (result.AsyncWaitHandle.WaitOne(timeout, false))
          {
               return callback.EndInvoke(result).HostName;
          }
          else 
          {
               return ip;
          }
     } 
     catch(Exception)
     {
          return ip;
     }
}

当它获得网络中 Windows 机器的 IP 时,它会显示正确的主机名,前提是您输入了合理的超时时间。在我进行测试后,android 和苹果设备的主机名没有得到任何响应。比如下图就是我手上的路由器的DHCP Client List。它显示 android、苹果和笔记本电脑设备。我正在使用笔记本电脑 'Nathu-Laptop' 给我一个 IP 地址“192.168.1.106”。

如果我在 C# 函数中输入“192.168.1.105”,结果是 'Nandwani-PC' 但如果我输入“192.168.1.103”、“192.168.1.104”、“192.168.1.101”、“192.168” .1.100',我没有得到任何主机名。

我也试过使用 nbtstat,但它只能获取网络中的笔记本电脑。

在我的 iPod 上试用时,我确保网络 activity 正在运行。这是为了让连接保持活动状态,因为它在待机时会断开网络连接。

编辑:

所以我发现 DNS.GetHostEntry 调用 getaddrinfo if IPv6 is enabled, otherwise, call gethostbyaddr 并且这些函数可以从 \System32\drivers\etc\hosts 或 NETBIOS 访问数据。问题是 NETBIOS 是遗留的,对吗?但是对于移动设备呢?

关于 NetBIOS:

为了回答您有关 NetBIOS 和网络名称解析的具体问题,我将提供更多详细信息。如果您的网络上没有 dns 服务器 运行,名称解析将仅依赖于 NetBIOS 解析。 It is a standard 并在多个操作系统上实现。不过速度不是很快。

即使我们老了,我们也不是过去的遗留物和过时的

您可以在 Microsoft support 上查看名称在 Windows 上的解析方式,NetBIOS 是最后一个。

然而,NetBios 名称解析并不总是在所有移动平台上都能正常运行(如 this bug on Android which was fixed in 2014)(例如取决于 Android 版本)。 如果你想提高性能,我建议你在网络中安装一个DNS服务器。

您是否尝试过ping -a <IP address>nslookup <IP address>检查结果是否符合您的预期?

如果您的问题仍然存在,那么您可以通过以上链接调查 .Net 实现。您还可以查看 a more up to date version of .Net DNS implementation here