.Net调用Ping类访问IPv6地址超时 控制台同地址Ping正常
问题根因
::ffff:192.168.178.20是IPv4映射格式的IPv6地址,.NET内置Ping类和Windows系统自带ping.exe对这类地址的处理逻辑存在差异:
- 系统
ping.exe会自动识别地址中内嵌的IPv4段,直接走IPv4协议栈发送ICMPv4请求,因此可以正常收到目标主机回应。 - .NET的
Ping类默认不会做这类自动转换,会将该地址识别为纯IPv6地址,走IPv6协议栈发送ICMPv6请求。而局域网内的目标主机通常未配置对应IPv6地址、或局域网路由不转发该类ICMPv6数据包,最终触发5秒超时,始终返回"Bad"。
修复方案
解析IP地址后增加判断,如果是IPv4映射的IPv6地址,先转换为原生IPv4地址再发起Ping请求即可,参考实现:
var ipString = "::ffff:192.168.178.20"; if (IPAddress.TryParse(ipString, out var ipaddr)){ // 转换IPv4映射的IPv6地址为原生IPv4地址 if (ipaddr.IsIPv4MappedToIPv6) { ipaddr = ipaddr.MapToIPv4(); } var reply = new Ping().Send(ipaddr, 5000); return reply.Status == IPStatus.Success ? "Good":"Bad"; }
如果使用的是未提供IsIPv4MappedToIPv6属性的老旧.NET Framework版本,可以手动判断地址格式:地址族为InterNetworkV6时,检查地址前10字节全为0、第11-12字节为0xffff,取最后4字节即可解析出内嵌的IPv4地址。
内容的提问来源于stack exchange,提问作者richej
相关产品推荐
相关产品推荐

