高朗:net.ParseIP()

Golang: net.ParseIP()

一些完全有效的 IPv6 地址被 net.ParseIP() 视为 IPv4,例如0000:0000:0000:0000:0000:ffff:0100:0000/::ffff:0100:0。 (请参阅 https://play.golang.org/p/57jAJVSIrHF 的简单示例)

处理这种情况最惯用的方法是什么? net 包不导出大部分功能,因此重写 net.Parse 会导致大量代码重复。

预先感谢您的帮助!

此致,

斯蒂芬

您认为完全有效的 IPv6 地址,如 ::ffff:0100:0000,实际上是映射到 IPv6 space 的 IPv4 地址,通常写为 ::ffff:1.0.0.0。因此本质上它是一个 IPv4 地址。有关详细信息,请参阅有关 IPv4-mapped IPv6 addresses in Wikipedia:IPv6 的部分。

IPAddress Go library 提供了对此类地址的更多 fine-grained 控制。免责声明:我是项目经理。

addrStr := ipaddr.NewIPAddressString("::ffff:0100:0")
addr := addrStr.GetAddress()
converter := ipaddr.DefaultAddressConverter{}
var ipv4Addr *ipaddr.IPv4Address
if converter.IsIPv4Convertible(addr) {
    ipv4Addr = converter.ToIPv4(addr)
}
fmt.Printf("original IPv4-mapped IPv6 address is %v, IPv4 address is %v",
    addr, ipv4Addr)

输出:

original IPv4-mapped IPv6 address is ::ffff:100:0, IPv4 address is 1.0.0.0