Things that will (and should) fail: 0.1.2.3 (0.0.0.0/8 is reserved for some broadcasts) 10.1.2.3 (10.0.0.0/8 is considered private) 172.16.1.2 (172.16.0.0/12 is considered private) 172.31.1.2 (same as previous, but near the end of that range) 192.168.1.2 (192.168.0.0/16 is considered private) 255.255.255.255 (reserved broadcast is not an IP) .2.3.4 1.2.3. I changed that regular expression as follow: const char* ipv4_regex = "\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\." "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\." "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\." "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\b"; const char* mcast_ipv4_regex = "\b(22[4-9]|23[0-9])\." "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\." "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]?
22.214.171.1246 1.2.256.4 1.256.3.4 2126.96.36.199 188.8.131.52.5 1..3.4 I think many people reading this post will be looking for simpler regular expressions, even if they match some technically invalid IP addresses. )\." "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\b"; def is_valid_ipv4(ip4): """Validates IPv4 addresses.
[0-7] ) ) | 0x0*[0-9a-f] # Hexadecimal notation, 0x0 - 0xffffffff | 0 [0-3]?
method does not * specify the algorithm used to select the address returned under such circumstances, and will often return the * loopback address, which is not valid for network communication. * * This method will scan all IP addresses on all network interfaces on the host machine to determine the IP address * most likely to be the machine's LAN address.
If the machine has multiple IP addresses, this method will prefer * a site-local IP address (e.g.
Each of the 4 numbers is stored into a capturing group, so you can access them for further processing. )\b"; I adapted the regular expression taken from JGsoft Regex Buddy library to C language (regcomp/regexec) and I found out it works but there's a little problem in some OS like Linux.
I was in search of something similar for IPv4 addresses - a regex that also stopped commonly used private ip addresses from being validated (192.168.x.y, 10.x.y.z, 172.16.x.y) so used negative look aheads to accomplish this: (These should be on one line of course, formatted for readability purposes on 3 separate lines) Debuggex Demo It may not be optimised for speed, but works well when only looking for 'real' internet addresses. That regular expression accepts ipv4 address like 192.168.100.009 where 009 in Linux is considered an octal value so the address is not the one you thought.
This includes checking the existence of the route to the destination according to the system's routing table and setting the local endpoint accordingly.
The last part seems to be undocumented officially but it looks like an integral trait of Berkeley sockets API (a side effect of UDP "connected" state) that works reliably in both Windows and Linux across versions and distributions.
192.168.x.x or 10.10.x.x, usually IPv4) if the machine has one (and will return the * first site-local address if the machine has more than one), but if the machine does not hold a site-local * address, this method will return simply the first non-loopback address found (IPv4 or IPv6).
* When you are looking for your "local" address, you should note that each machine has not only a single network interface, and each interface could has its own local address.
What this means is that the IP address returned by In fact, the Inet Address API provides methods for testing for loopback, link local, site local, multicast and broadcast addresses.
You can use these to sort out which of the IP addresses you get back is most appropriate.
For example, when you connect to This is a working example of the ACCEPTED answer above! Some of the objects returned are Ethernet Adapters, Network Adapters, Virtual Network Adapters, Drivers, and VPN Client Adapters. So you'll want to skip out on interface objects that don't. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).