// // Copyright (c) 2007, Brian Frank and Andy Frank // Licensed under the Academic Free License version 3.0 // // History: // 9 Feb 07 Brian Frank Creation // ** ** IpAddr models both IPv4 and IPv6 numeric addresses as well ** as provide DNS hostname resolution. ** final const class IpAddr { ////////////////////////////////////////////////////////////////////////// // Construction ////////////////////////////////////////////////////////////////////////// ** ** Parse an IP address formated as an IPv4 numeric address, IPv6 ** numeric address, or a DNS hostname. If a hostname if provided, ** then it is resolved to an IP address potentially blocking the ** calling thread. If the address is invalid or a hostname cannot ** be resolved then UnknownHostErr is thrown. ** ** Examples: ** IpAddr("169.200.3.103") ** IpAddr("1080:0:0:0:8:800:200C:417A") ** IpAddr("1080::8:800:200C:417A") ** IpAddr("::ffff:129.144.52.38") ** IpAddr("somehost") ** IpAddr("www.acme.com") ** static new make(Str s) { makeNative(s) } private native static IpAddr makeNative(Str s) ** ** Resolve a hostname to all of its configured IP addresses. If a ** numeric IPv4 or IPv6 address is specified then a list of one ** IpAddr is returned. If a hostname if provided, then it is ** resolved to all its configured IP addresses potentially blocking ** the calling thread. If the address is invalid or a hostname ** cannot be resolved then UnknownHostErr is thrown. ** native static IpAddr[] makeAll(Str s) ** ** Make an IpAddr for the specified raw bytes. The size of ** the byte buffer must be 4 for IPv4 or 16 for IPv6, otherwise ** ArgErr is thrown. The bytes must be a memory backed buffer. ** native static IpAddr makeBytes(Buf bytes) ** ** Return the IpAddr for the local machine. ** native static IpAddr local() ** ** Private constructor. ** internal new internalMake() {} ////////////////////////////////////////////////////////////////////////// // Identity ////////////////////////////////////////////////////////////////////////// ** ** Hash code is based the address bytes. ** override native Int hash() ** ** Equality is based on equivalent address bytes. ** override native Bool equals(Obj? obj) ** ** Return the exact string passed to the constructor. ** override native Str toStr() ////////////////////////////////////////////////////////////////////////// // Methods ////////////////////////////////////////////////////////////////////////// ** ** Is this a 32 bit (four byte) IP version 4 address. ** native Bool isIPv4() ** ** Is this a 128 bit (sixteen byte) IP version 6 address. ** native Bool isIPv6() ** ** Is this a loopback address. ** native Bool isLoopback() ** ** Is this a site local address. ** native Bool isSiteLocal() ** ** Get the raw bytes of this address as a Buf of 4 or 16 bytes ** for IPv4 or IPv6 respectively. The buf position is zero. ** native Buf bytes() ** ** Get this address as a Str in its numeric notation. For IPv4 ** this is four decimal digits separated by dots. For IPv6 this ** is eight hexadecimal digits separated by colons. ** native Str numeric() ** ** Return the hostname of this address. If a hostname was specified ** in make, then that string is used. Otherwise this method will perform ** a reverse DNS lookup potentially blocking the calling thread. If ** the address cannot be mapped to a hostname, then return the address ** in its numeric format. ** native Str hostname() ** ** To the native platform representation: ** - Java: returns 'java.net.InetAddress' ** - .NET: returns 'System.Net.IPAddress' ** native Obj toNative() }