33 static void zeroUnusedBytes (uint8* address) noexcept
35 for (
int i = 4; i < 16; ++i)
41 for (
int i = 0; i < 16; ++i)
47 for (
int i = 0; i < (isIPv6 ? 16 : 4); ++i)
48 address[i] = bytes[i];
51 zeroUnusedBytes (address);
58 for (
int i = 0; i < 8; ++i)
60 temp.combined = bytes[i];
62 address[i * 2] = temp.split[0];
63 address[i * 2 + 1] = temp.split[1];
69 address[0] = a0; address[1] = a1;
70 address[2] = a2; address[3] = a3;
72 zeroUnusedBytes (address);
76 uint16 a5, uint16 a6, uint16 a7, uint16 a8) noexcept : isIPv6 (
true)
79 uint16 array[8] = { a1, a2, a3, a4, a5, a6, a7, a8 };
83 for (
int i = 0; i < 8; ++i)
85 temp.combined = array[i];
86 address[i * 2] = temp.split[0];
87 address[i * 2 + 1] = temp.split[1];
93 address[0] = (n >> 24);
94 address[1] = (n >> 16) & 255;
95 address[2] = (n >> 8) & 255;
96 address[3] = (n & 255);
98 zeroUnusedBytes (address);
103 for (
int i = 0; i < 16; ++i)
123 auto ipAddress = removePort (adr);
125 isIPv6 = ipAddress.contains (
":");
131 for (
int i = 0; i < 4; ++i)
132 address[i] = (uint8) tokens[i].getIntValue();
134 zeroUnusedBytes (address);
140 if (tokens.contains ({}))
142 auto idx = tokens.
indexOf ({});
143 tokens.set (idx,
"0");
144 tokens.removeEmptyStrings();
147 if (tokens[tokens.size() - 1].containsChar (
'.'))
150 while (tokens.size() < 8)
151 tokens.insert (idx,
"0");
154 for (
int i = 0; i < 8; ++i)
156 if (i == 6 && isIPv4MappedAddress (
IPAddress (address,
true)))
160 address[12] = v4Address.
address[0];
161 address[13] = v4Address.
address[1];
162 address[14] = v4Address.
address[2];
163 address[15] = v4Address.
address[3];
171 address[i * 2] = temp.split[0];
172 address[i * 2 + 1] = temp.split[1];
181 String s ((
int) address[0]);
183 for (
int i = 1; i < 4; ++i)
184 s <<
'.' << (
int) address[i];
191 temp.split[0] = address[0];
192 temp.split[1] = address[1];
196 for (
int i = 1; i < 8; ++i)
198 temp.split[0] = address[i * 2];
199 temp.split[1] = address[i * 2 + 1];
204 return getFormattedAddress (addressString);
207 bool IPAddress::operator== (
const IPAddress& other)
const noexcept {
return compare (other) == 0; }
208 bool IPAddress::operator!= (
const IPAddress& other)
const noexcept {
return compare (other) != 0; }
209 bool IPAddress::operator< (
const IPAddress& other)
const noexcept {
return compare (other) < 0; }
210 bool IPAddress::operator<= (
const IPAddress& other)
const noexcept {
return compare (other) <= 0; }
211 bool IPAddress::operator> (
const IPAddress& other)
const noexcept {
return compare (other) > 0; }
212 bool IPAddress::operator>= (
const IPAddress& other)
const noexcept {
return compare (other) >= 0; }
216 if (isIPv6 != other.isIPv6)
220 if (isIPv4MappedAddress (*
this))
221 return convertIPv4MappedAddressToIPv4 (*this).compare (other);
226 if (isIPv4MappedAddress (other))
227 return compare (convertIPv4MappedAddressToIPv4 (other));
232 for (
int i = 0; i < (isIPv6 ? 16 : 4); ++i)
234 if (address[i] > other.
address[i])
return 1;
235 if (address[i] < other.
address[i])
return -1;
244 : IPAddress (127, 0, 0, 1); }
248 jassert (unformattedAddress.
contains (
":") && ! unformattedAddress.
contains (
"::"));
251 auto addressString = unformattedAddress.
dropLastCharacters (portString.length()).removeCharacters (
"[]");
256 int numZerosTemp = 0;
257 bool isFirst =
false;
260 for (
int i = 0; i < tokens.size(); ++i)
264 if (t.getHexValue32() == 0x0000)
270 else if (i == tokens.size() - 1 && numZeros > numZerosTemp)
276 if (isFirst && numZerosTemp != 0 && numZeros > numZerosTemp)
281 addressString = addressString.
replace (t, t.trimCharactersAtStart (
"0").toLowerCase());
285 if (numZeros > numZerosTemp)
286 numZerosTemp = numZeros;
293 if (numZerosTemp > numZeros)
294 numZeros = numZerosTemp;
298 if (numZeros == tokens.size())
300 addressString =
"::,";
307 addressString = addressString.replaceFirstOccurrenceOf (zeroString,
":");
310 addressString <<
':';
314 if (portString.isNotEmpty())
315 addressString =
"[" + addressString +
"]" + portString;
317 return addressString;
322 if (! mappedAddress.isIPv6)
325 for (
int i = 0; i < 10; ++i)
326 if (mappedAddress.
address[i] != 0)
329 if (mappedAddress.
address[10] != 255 || mappedAddress.
address[11] != 255)
338 jassert (mappedAddress.isIPv6);
340 if (isIPv4MappedAddress (mappedAddress))
350 jassert (! addressToMap.isIPv6);
352 return { 0x0, 0x0, 0x0, 0x0, 0x0, 0xffff,
353 static_cast<uint16
> ((addressToMap.
address[0] << 8) | addressToMap.
address[1]),
354 static_cast<uint16
> ((addressToMap.
address[2] << 8) | addressToMap.
address[3]) };
359 auto addresses = getAllAddresses (includeIPv6);
361 for (
auto& a : addresses)
371 findAllAddresses (addresses, includeIPv6);
380 struct IPAddressTests :
public UnitTest 383 :
UnitTest (
"IPAddress", UnitTestCategories::networking)
386 void runTest()
override 389 testFindAllAddresses();
390 testFindBroadcastAddress();
393 void testConstructors()
395 beginTest (
"constructors");
399 expect (defaultConstructed.
isNull());
402 expect (! local.isNull());
405 expect (! ipv4.isNull());
406 expect (! ipv4.isIPv6);
407 expect (ipv4.toString() ==
"1.2.3.4");
410 void testFindAllAddresses()
412 beginTest (
"find all addresses");
420 expect (allAddresses.
size() >= ipv4Addresses.
size());
422 for (
auto& a : ipv4Addresses)
424 expect (! a.isNull());
428 for (
auto& a : allAddresses)
430 expect (! a.isNull());
434 void testFindBroadcastAddress()
436 beginTest (
"broadcast addresses");
443 for (
auto& a : addresses)
445 expect (! a.isNull());
450 if (! broadcastAddress.isNull())
462 static IPAddressTests iPAddressTests;
String toString() const
Returns a dot- or colon-separated string in the form "1.2.3.4" (IPv4) or "1:2:3:4:5:6:7:8" (IPv6)...
Union used to split a 16-bit unsigned integer into 2 8-bit unsigned integers or vice-versa.
static IPAddress convertIPv4AddressToIPv4Mapped(const IPAddress &addressToMap)
Converts an IPv4 address to an IPv4-mapped IPv6 address.
static String getFormattedAddress(const String &unformattedAddress)
Returns a formatted version of the provided IPv6 address conforming to RFC 5952 with leading zeros su...
String fromFirstOccurrenceOf(StringRef substringToStartFrom, bool includeSubStringInResult, bool ignoreCase) const
Returns a section of the string starting from a given substring.
Represents an IP address.
static IPAddress broadcast() noexcept
Returns an IPv4 address meaning "broadcast" (255.255.255.255)
int lastIndexOf(StringRef textToLookFor) const noexcept
Searches for a substring inside this string (working backwards from the end of the string)...
String dropLastCharacters(int numberToDrop) const
Returns a version of this string with a number of characters removed from the end.
IPAddress() noexcept
Creates a null address - 0.0.0.0 (IPv4) or ::, (IPv6)
static bool isIPv4MappedAddress(const IPAddress &mappedAddress)
Returns true if the given IP address is an IPv4-mapped IPv6 address.
This is a base class for classes that perform a unit test.
String & getReference(int index) noexcept
Returns a reference to one of the strings in the array.
int indexOf(StringRef stringToLookFor, bool ignoreCase=false, int startIndex=0) const
Searches for a string in the array.
uint8 address[16]
The elements of the IP address.
static String repeatedString(StringRef stringToRepeat, int numberOfTimesToRepeat)
Creates a string which is a version of a string repeated and joined together.
bool containsAnyOf(StringRef charactersItMightContain) const noexcept
Looks for any of a set of characters in the string.
static IPAddress convertIPv4MappedAddressToIPv4(const IPAddress &mappedAddress)
Converts an IPv4-mapped IPv6 address to an IPv4 address.
bool contains(StringRef text) const noexcept
Tests whether the string contains another substring.
bool isNull() const
Returns whether the address contains the null address (e.g.
static void findAllAddresses(Array< IPAddress > &results, bool includeIPv6=false)
Populates a list of all the IP addresses that this machine is using.
static String toHexString(IntegerType number)
Returns a string representing this numeric value in hexadecimal.
String upToLastOccurrenceOf(StringRef substringToFind, bool includeSubStringInResult, bool ignoreCase) const
Returns the start of this string, up to the last occurrence of a substring.
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Returns an array containing the tokens in a given string.
static Array< IPAddress > getAllAddresses(bool includeIPv6=false)
Populates a list of all the IP addresses that this machine is using.
int indexOf(StringRef textToLookFor) const noexcept
Searches for a substring within this string.
Holds a resizable array of primitive or copy-by-value objects.
int size() const noexcept
Returns the current number of elements in the array.
static IPAddress getLocalAddress(bool includeIPv6=false)
Returns the first 'real' address for the local machine.
String replace(StringRef stringToReplace, StringRef stringToInsertInstead, bool ignoreCase=false) const
Replaces all occurrences of a substring with another string.
static IPAddress any() noexcept
Returns an IP address meaning "any", equivalent to 0.0.0.0 (IPv4) or ::, (IPv6)
static IPAddress local(bool IPv6=false) noexcept
Returns an IPv4 or IPv6 address meaning "localhost", equivalent to 127.0.0.1 (IPv4) or ::1 (IPv6) ...
int compare(const IPAddress &) const noexcept
Compares this IPAddress with another.
static IPAddress getInterfaceBroadcastAddress(const IPAddress &interfaceAddress)
If the IPAdress is the address of an interface on the machine, returns the associated broadcast addre...
Parses a character string, to read a hexadecimal value.