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);
56 IPAddressByteUnion temp;
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();
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)
171 address[i * 2] = temp.split[0];
172 address[i * 2 + 1] = temp.split[1];
183 for (
int i = 1; i < 4; ++i)
196 for (
int i = 1; i < 8; ++i)
198 temp.split[0] =
address[i * 2];
199 temp.split[1] =
address[i * 2 + 1];
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;
243 IPAddress IPAddress::local (
bool IPv6) noexcept {
return IPv6 ?
IPAddress (0, 0, 0, 0, 0, 0, 0, 1)
248 jassert (unformattedAddress.
contains (
":") && ! unformattedAddress.
contains (
"::"));
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);
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]) };
361 for (
auto& a : addresses)
380 struct IPAddressTests :
public UnitTest
383 :
UnitTest (
"IPAddress", UnitTestCategories::networking)
386 void runTest()
override
389 testFindAllAddresses();
390 testFindBroadcastAddress();
393 void testConstructors()
395 beginTest (
"constructors");
398 IPAddress defaultConstructed;
399 expect (defaultConstructed.isNull());
401 auto local = IPAddress::local();
402 expect (! local.isNull());
404 IPAddress ipv4{1, 2, 3, 4};
405 expect (! ipv4.isNull());
406 expect (! ipv4.isIPv6);
407 expect (ipv4.toString() ==
"1.2.3.4");
410 void testFindAllAddresses()
412 beginTest (
"find all addresses");
414 Array<IPAddress> ipv4Addresses;
415 Array<IPAddress> allAddresses;
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");
438 Array<IPAddress> addresses;
443 for (
auto& a : addresses)
445 expect (! a.isNull());
450 if (! broadcastAddress.isNull())
457 IPAddress address{1, 2, 3, 4};
462 static IPAddressTests iPAddressTests;
Holds a resizable array of primitive or copy-by-value objects.
Represents an IP address.
static Array< IPAddress > getAllAddresses(bool includeIPv6=false)
Populates a list of all the IP addresses that this machine is using.
static IPAddress getLocalAddress(bool includeIPv6=false)
Returns the first 'real' address for the local machine.
bool isNull() const
Returns whether the address contains the null address (e.g.
static bool isIPv4MappedAddress(const IPAddress &mappedAddress)
Returns true if the given IP address is an IPv4-mapped IPv6 address.
static IPAddress any() noexcept
Returns an IP address meaning "any", equivalent to 0.0.0.0 (IPv4) or ::, (IPv6)
static String getFormattedAddress(const String &unformattedAddress)
Returns a formatted version of the provided IPv6 address conforming to RFC 5952 with leading zeros su...
int compare(const IPAddress &) const noexcept
Compares this IPAddress with another.
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).
static IPAddress broadcast() noexcept
Returns an IPv4 address meaning "broadcast" (255.255.255.255)
static void findAllAddresses(Array< IPAddress > &results, bool includeIPv6=false)
Populates a list of all the IP addresses that this machine is using.
uint8 address[16]
The elements of the IP address.
static IPAddress convertIPv4AddressToIPv4Mapped(const IPAddress &addressToMap)
Converts an IPv4 address to an IPv4-mapped IPv6 address.
static IPAddress convertIPv4MappedAddressToIPv4(const IPAddress &mappedAddress)
Converts an IPv4-mapped IPv6 address to an IPv4 address.
IPAddress() noexcept
Creates a null address - 0.0.0.0 (IPv4) or ::, (IPv6)
static IPAddress getInterfaceBroadcastAddress(const IPAddress &interfaceAddress)
If the IPAdress is the address of an interface on the machine, returns the associated broadcast addre...
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.
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Returns an array containing the tokens in a given string.
static String repeatedString(StringRef stringToRepeat, int numberOfTimesToRepeat)
Creates a string which is a version of a string repeated and joined together.
String removeCharacters(StringRef charactersToRemove) const
Returns a version of this string with a set of characters removed.
int indexOf(StringRef textToLookFor) const noexcept
Searches for a substring within this string.
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.
bool contains(StringRef text) const noexcept
Tests whether the string contains another substring.
static String toHexString(IntegerType number)
Returns a string representing this numeric value in hexadecimal.
String replace(StringRef stringToReplace, StringRef stringToInsertInstead, bool ignoreCase=false) const
Replaces all occurrences of a substring with another string.
String upToLastOccurrenceOf(StringRef substringToFind, bool includeSubStringInResult, bool ignoreCase) const
Returns the start of this string, up to the last occurrence of a substring.
bool containsAnyOf(StringRef charactersItMightContain) const noexcept
Looks for any of a set of characters in the string.
String fromFirstOccurrenceOf(StringRef substringToStartFrom, bool includeSubStringInResult, bool ignoreCase) const
Returns a section of the string starting from a given substring.
This is a base class for classes that perform a unit test.
Parses a character string, to read a hexadecimal value.
Union used to split a 16-bit unsigned integer into 2 8-bit unsigned integers or vice-versa.