Nat*_*thu 3 c# dns lan hostname wifi
我在 C# 中有一个 Windows 窗体应用程序,我正在尝试获取列表中所有客户端的主机名。下面给出了 ra00l 来自此链接的代码示例:GetHostEntry 非常慢(我制作了类似的代码,但这个代码更清晰)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
当它获得网络中 Windows 机器的 IP 时,它会显示正确的主机名,前提是您输入了合理的超时时间。经过我的测试,我没有得到任何关于 android 和苹果设备的主机名的响应。比如下图就是我手头的路由器的DHCP Client List。它显示了安卓、苹果和笔记本电脑设备。我正在使用笔记本电脑“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', '810,192.I.不要得到任何主机名。
我也尝试使用 nbtstat 但它只能获取网络中的笔记本电脑。
在我的 iPod 上尝试这个时,我确保有网络活动正在进行。这是为了保持连接处于活动状态,因为它在待机时与网络断开连接。
编辑:
所以我发现如果启用了 IPv6 ,DNS.GetHostEntry 会调用getaddrinfo,否则,调用gethostbyaddr并且这些函数可能会访问来自\System32\drivers\etc\hosts或可能来自 NETBIOS的数据。问题是 NETBIOS 是传统的,对吗?但是对于移动设备呢?
关于 NetBIOS:
为了回答您有关 NetBIOS 和网络名称解析的具体问题,我将提供更多详细信息。如果您的网络上没有运行 dns 服务器,名称解析将仅依赖于 NetBIOS 解析。 它是一个标准,并在多个操作系统上实现。然而,它并不是很快。
即使我们老了,我们也不是过去的遗产和过时的
您可以查看Microsoft 支持在 Windows 上解析名称的方式,而 NetBIOS 是最后一个。
然而,NetBios 名称解析并不总是在所有移动平台(例如取决于 Android 版本)上都能正常运行(例如Android 上的这个错误,它已于 2014 年修复)。如果你想提高性能,我建议你在网络中安装一个DNS服务器。
您是否尝试ping -a <IP address>或nslookup <IP address>检查过结果是否符合您的预期?
如果您的问题仍然存在,那么您可以通过上述链接调查 .Net 实现。您还可以在此处查看 .Net DNS 实施的最新版本