如何在 Swift 中验证 IPv4 和 IPv6 地址?

Dar*_*oot 3 network-programming swift

IPv4 地址相对容易验证:它们有 4 个八位字节,由数字分隔。每个八位位组都是 0-255 范围内的整数。

IPv6 地址很难验证。它们有 8 个十六进制数,每个十六进制数有 4 个十六进制数字,用冒号分隔。IPv6 地址还具有缩短规则,可以删除每个十六进制数中的前导零(在每个十六进制数中至少留下一个零)。此外,一个或多个连续的 :0: 十六进制可以缩短为 ::,但每个 IPv6 地址中只能缩短一次。

如何在 Swift 中验证 IPv4 和 IPv6 地址?

Dar*_*oot 5

网络框架对于采用 String 构造函数的结构体 IPv4Address 和 IPv6Address 有一个可失败的初始值设定项。只需测试是否可以使用字符串初始化结构就足以验证地址。

这对于具有长格式且具有重要缩短规则的 IPv6 地址特别有用。

import Network

let addresses = ["1.2.33.44","1.265.33.33","2001:db8::35:44","2001:db8::33::44"]

for address in addresses {
    if let _ = IPv4Address(address) {
        print("address \(address) is a valid IPv4 address")
    } else if let _ = IPv6Address(address) {
        print("address \(address) is a valid IPv6 address")
    } else {
        print("address \(address) is neither an IPv4 address nor an IPv6 address")
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

address 1.2.33.44 is a valid IPv4 address
address 1.265.33.33 is neither an IPv4 address nor an IPv6 address
address 2001:db8::35:44 is a valid IPv6 address
address 2001:db8::33::44 is neither an IPv4 address nor an IPv6 address
Run Code Online (Sandbox Code Playgroud)