IpAddr
struct IpAddrAn IP address: either IPv4 or IPv6.
The address is stored as a validated string produced by inet_ntop
after successful inet_pton parsing. This guarantees all instances
hold a canonical, valid representation.
Fields:
_addr: Canonical string form (e.g. "127.0.0.1" or "::1").
_is_v6: True for IPv6, False for IPv4.
Example:
var lo = IpAddr.parse("127.0.0.1")
print(lo) # 127.0.0.1
print(lo.is_loopback()) # True
Implements Copyable, Equatable, ImplicitlyCopyable, Movable, Writable
__init__
def __init__(out self, addr: String, is_v6: Bool) Construct an IpAddr directly from a pre-validated string.
Prefer IpAddr.parse for user-supplied strings.
- Args
addr: Canonical IP address string.is_v6:Trueif this is an IPv6 address.
__eq__
def __eq__(self, other: Self) -> Bool Return True if both addresses have the same family and string.
- Args
other: The address to compare with.
__ne__
def __ne__(self, other: Self) -> Bool Return True if the addresses differ.
- Args
other: The address to compare with.
parse
def parse(s: String) -> Self Parse and validate an IP address string.
Accepts dotted-decimal IPv4 ("192.168.1.1") and colon-separated
IPv6 ("::1", "2001:db8::1"). Uses inet_pton for
correctness, then inet_ntop to obtain the canonical form.
Example:
var v4 = IpAddr.parse("192.168.0.1")
var v6 = IpAddr.parse("::1")
- Args
s: The address string to parse.
Raises AddressParseError: If s is not a valid IPv4 or IPv6 address.
localhost
def localhost() -> Self Return the IPv4 loopback address 127.0.0.1.
localhost_v6
def localhost_v6() -> Self Return the IPv6 loopback address ::1.
unspecified
def unspecified() -> Self Return the IPv4 wildcard address 0.0.0.0 (all interfaces).
unspecified_v6
def unspecified_v6() -> Self Return the IPv6 wildcard address :: (all interfaces).
is_v4
def is_v4(self) -> Bool Return True if this is an IPv4 address.
is_v6
def is_v6(self) -> Bool Return True if this is an IPv6 address.
is_loopback
def is_loopback(self) -> Bool Return True if this is a loopback address.
IPv4 loopback range is 127.0.0.0/8; IPv6 loopback is ::1.
is_unspecified
def is_unspecified(self) -> Bool Return True if this is the wildcard/unspecified address.
IPv4: "0.0.0.0"; IPv6: "::".
is_private
def is_private(self) -> Bool Return True if this is an RFC 1918 private address.
Covers 10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16.
IPv6 ULA (fc00::/7) is not yet detected and returns False.
is_multicast
def is_multicast(self) -> Bool Return True if this is a multicast address.
IPv4 multicast: 224.0.0.0/4 (first octet 224–239).
IPv6 multicast: ff00::/8 (RFC 4291 section 2.7), i.e. the
first byte is 0xff. The stored text is inet_ntop's
(RFC 5952), which drops leading zeros of a group, so first groups
0x00ff and 0x0ff0..0x0fff print as ff... too; a
real multicast first group always has four digits, so the first
: must be at index 4.
write_to
def write_to[W: Writer](self, mut writer: W) Write the canonical address string to writer.
- Args
writer: Destination writer.