如何获取局域网内另一台设备的IPv6地址?
如何获取局域网内另一台设备的IPv6地址?
嘿,我来帮你捋捋这个问题~你现在的情况是:自己的PC和NAS在同一个局域网里,俩设备明明都有IPv6地址,但用C#的Dns.GetHostAddresses(Dns.GetHostName())能正常拿到自己电脑的IPv6,可调用Dns.GetHostAddresses("MyNasName")时,却只返回NAS的IPv4地址,连ping MyNasName也只会解析到192.1开头的IPv4,你拿不准这是网络配置的锅还是代码的问题,对吧?
我给你分两部分来排查:
先查网络层面的可能
- 先确认NAS的IPv6是不是真的在正常跑:直接进NAS的管理后台,看看它的网络配置里,IPv6有没有开启,有没有拿到有效的局域网IPv6地址(一般是fd开头的唯一本地地址,或者fe80开头的链路本地地址)。要是NAS本身就没正确获取到IPv6,那肯定解析不出来。
- 检查路由器的DNS设置:你的局域网DNS一般就是路由器,看看路由器有没有开启IPv6的DNS解析支持,或者有没有把NAS的主机名和它的IPv6地址绑定(也就是添加IPv6的主机记录)。很多路由器默认优先返回IPv4,甚至没配置IPv6的解析,导致查主机名时只会给IPv4地址。
- 试试强制IPv6解析的ping命令:Windows里用
ping -6 MyNasName,Linux/macOS用ping6 MyNasName。如果这个命令能拿到NAS的IPv6,那说明网络是通的,问题出在代码的解析逻辑;要是还是不行,那基本就是NAS或者路由器的IPv6配置有问题,得先把网络这块调通。
再看代码层面的调整
- 过滤IPv6地址:
Dns.GetHostAddresses默认可能优先返回IPv4,或者系统DNS策略是IPv4优先,你可以在拿到地址列表后,手动过滤出IPv6类型的地址:using System.Net; using System.Linq; var hostAddresses = Dns.GetHostAddresses("MyNasName"); var ipv6Addresses = hostAddresses.Where(ip => ip.AddressFamily == AddressFamily.InterNetworkV6).ToList(); // 遍历输出拿到的IPv6地址 foreach (var ipv6 in ipv6Addresses) { Console.WriteLine("NAS的IPv6地址:" + ipv6.ToString()); } - 试试
Dns.GetHostEntry方法:有时候这个方法的解析结果会更全面,你也可以用它来获取地址,再过滤IPv6:var hostEntry = Dns.GetHostEntry("MyNasName"); var ipv6Addresses = hostEntry.AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetworkV6).ToList(); - 注意链路本地地址的特殊性:如果拿到的是fe80开头的链路本地地址,访问的时候需要指定网络接口(比如Windows里要加%接口索引,像
fe80::xxxx:xxxx:xxxx:xxxx%3),代码里处理这种地址的话,可能需要额外获取网络接口信息,但如果是fd开头的唯一本地地址,就不用这么麻烦,直接用就行。
备注:内容来源于stack exchange,提问作者Dee J. Doena
相关产品推荐
相关产品推荐

