高朗: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
一些完全有效的 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