You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取局域网内另一台设备的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:38:21