IPNetwork command line and C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. It works with IPv4 as well as IPv6, is written in C#, has a light and clean API, and is fully unit-tested.
IPNetwork utility classes take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. It works with IPv4 as well as IPv6, is written in C#, has a light and clean API, and is fully unit-tested with 100% code coverage.
PM> nuget install IPNetwork2
IPNetworkipnetwork=IPNetwork.Parse("2001:0db8::/64");Console.WriteLine("Network : {0}",ipnetwork.Network);Console.WriteLine("Netmask : {0}",ipnetwork.Netmask);Console.WriteLine("Broadcast : {0}",ipnetwork.Broadcast);Console.WriteLine("FirstUsable : {0}",ipnetwork.FirstUsable);Console.WriteLine("LastUsable : {0}",ipnetwork.LastUsable);Console.WriteLine("Usable : {0}",ipnetwork.Usable);Console.WriteLine("Cidr : {0}",ipnetwork.Cidr);Output
Network : 2001:db8::
Netmask : ffff:ffff:ffff:ffff::
Broadcast :
FirstUsable : 2001:db8::
LastUsable : 2001:db8::ffff:ffff:ffff:ffff
Usable : 18446744073709551616
Cidr : 64IPNetworkipnetwork=IPNetwork.Parse("2001:0db8::/64");IPAddressipaddress=IPAddress.Parse("2001:0db8::1");IPAddressipaddress2=IPAddress.Parse("2001:0db9::1");IPNetworkipnetwork2=IPNetwork.Parse("2001:0db8::1/128");IPNetworkipnetwork3=IPNetwork.Parse("2001:0db9::1/64");boolcontains1=ipnetwork.Contains(ipaddress);boolcontains2=ipnetwork.Contains(ipaddress2);boolcontains3=ipnetwork.Contains(ipnetwork2);boolcontains4=ipnetwork.Contains(ipnetwork3);booloverlap1=ipnetwork.Overlap(ipnetwork2);booloverlap2=ipnetwork.Overlap(ipnetwork3);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipaddress,contains1);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipaddress2,contains2);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipnetwork2,contains3);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipnetwork3,contains4);Console.WriteLine("{0} overlap {1} : {2}",ipnetwork,ipnetwork2,overlap1);Console.WriteLine("{0} overlap {1} : {2}",ipnetwork,ipnetwork3,overlap2);Output
2001:db8::/64contains2001:db8::1:True2001:db8::/64contains2001:db9::1:False2001:db8::/64contains2001:db8::1/128 : True2001:db8::/64contains2001:db9::/64 : False2001:db8::/64overlap2001:db8::1/128 : True2001:db8::/64overlap2001:db9::/64 : FalseIPNetworkwholeInternet=IPNetwork.Parse("::/0");bytenewCidr=2;IPNetworkCollectionsubneted=wholeInternet.Subnet(newCidr);Console.WriteLine("{0} was subnetted into {1} subnets",wholeInternet,subneted.Count);Console.WriteLine("First: {0}",subneted[0]);Console.WriteLine("Last : {0}",subneted[subneted.Count-1]);Console.WriteLine("All :");foreach(IPNetworkipnetworkinsubneted){Console.WriteLine("{0}",ipnetwork);}Output
::/0wassubnettedinto4subnetsFirst: ::/2Last : c000::/2All :
::/24000::/28000::/2c000::/2IPNetworkipnetwork1=IPNetwork.Parse("2001:0db8::/32");IPNetworkipnetwork2=IPNetwork.Parse("2001:0db9::/32");IPNetwork[]ipnetwork3=IPNetwork.Supernet(new[]{ipnetwork1,ipnetwork2});Console.WriteLine("{0} + {1} = {2}",ipnetwork1,ipnetwork2,ipnetwork3[0]);Output
2001:db8::/32+2001:db9::/32=2001:db8::/31IPNetworkipnetwork=IPNetwork.Parse("192.168.168.100/24");Console.WriteLine("Network : {0}",ipnetwork.Network);Console.WriteLine("Netmask : {0}",ipnetwork.Netmask);Console.WriteLine("Broadcast : {0}",ipnetwork.Broadcast);Console.WriteLine("FirstUsable : {0}",ipnetwork.FirstUsable);Console.WriteLine("LastUsable : {0}",ipnetwork.LastUsable);Console.WriteLine("Usable : {0}",ipnetwork.Usable);Console.WriteLine("Cidr : {0}",ipnetwork.Cidr);Output
Network : 192.168.168.0
Netmask : 255.255.255.0
Broadcast : 192.168.168.255
FirstUsable : 192.168.168.1
LastUsable : 192.168.168.254
Usable : 254
Cidr : 24IPNetworkipnetwork=IPNetwork.Parse("192.168.0.0/24");IPAddressipaddress=IPAddress.Parse("192.168.0.100");IPAddressipaddress2=IPAddress.Parse("192.168.1.100");IPNetworkipnetwork2=IPNetwork.Parse("192.168.0.128/25");IPNetworkipnetwork3=IPNetwork.Parse("192.168.1.1/24");boolcontains1=ipnetwork.Contains(ipaddress);boolcontains2=ipnetwork.Contains(ipaddress2);boolcontains3=ipnetwork.Contains(ipnetwork2);boolcontains4=ipnetwork.Contains(ipnetwork3);booloverlap1=ipnetwork.Overlap(ipnetwork2);booloverlap2=ipnetwork.Overlap(ipnetwork3);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipaddress,contains1);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipaddress2,contains2);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipnetwork2,contains3);Console.WriteLine("{0} contains {1} : {2}",ipnetwork,ipnetwork3,contains4);Console.WriteLine("{0} overlap {1} : {2}",ipnetwork,ipnetwork2,overlap1);Console.WriteLine("{0} overlap {1} : {2}",ipnetwork,ipnetwork3,overlap2); AOutput
192.168.0.0/24contains192.168.0.100 : True192.168.0.0/24contains192.168.1.100 : False192.168.0.0/24contains192.168.0.128/25 : True192.168.0.0/24contains192.168.1.0/24 : False192.168.0.0/24overlap192.168.0.128/25 : True192.168.0.0/24overlap192.168.1.0/24 : FalseIPNetworkiana_a_block=IPNetwork.IANA_ABLK_RESERVED1;IPNetworkiana_b_block=IPNetwork.IANA_BBLK_RESERVED1;IPNetworkiana_c_block=IPNetwork.IANA_CBLK_RESERVED1;Console.WriteLine("IANA_ABLK_RESERVED1 is {0}",iana_a_block);Console.WriteLine("IANA_BBLK_RESERVED1 is {0}",iana_b_block);Console.WriteLine("IANA_CBLK_RESERVED1 is {0}",iana_c_block);Output
IANA_ABLK_RESERVED1is10.0.0.0/8IANA_BBLK_RESERVED1is172.16.0.0/12IANA_CBLK_RESERVED1is192.168.0.0/16IPNetworkwholeInternet=IPNetwork.Parse("0.0.0.0/0");bytenewCidr=2;IPNetworkCollectionsubneted=wholeInternet.Subnet(newCidr);Console.WriteLine("{0} was subnetted into {1} subnets",wholeInternet,subneted.Count);Console.WriteLine("First: {0}",subneted[0]);Console.WriteLine("Last : {0}",subneted[subneted.Count-1]);Console.WriteLine("All :");foreach(IPNetworkipnetworkinsubneted){Console.WriteLine("{0}",ipnetwork);}Output
0.0.0.0/0wassubnettedinto4subnets
First: 0.0.0.0/2
Last : 192.0.0.0/2
All :
0.0.0.0/264.0.0.0/2128.0.0.0/2192.0.0.0/2IPNetworkipnetwork1=IPNetwork.Parse("192.168.0.0/24");IPNetworkipnetwork2=IPNetwork.Parse("192.168.1.0/24");IPNetwork[]ipnetwork3=IPNetwork.Supernet(new[]{ipnetwork1,ipnetwork2});Console.WriteLine("{0} + {1} = {2}",ipnetwork1,ipnetwork2,ipnetwork3[0]);Output
192.168.0.0/24+192.168.1.0/24=192.168.0.0/23If you don't specify the network cidr, IPNetwork will try to guess the CIDR for you. There are two strategies to guess ClassFull (default) and ClassLess.
is based on the default Class A, B or C networks. IPV4 :
- Class A: 0 - 127 with a mask of 255.0.0.0 (/8)
- Class B: 128 - 191 with a mask of 255.255.0.0 (/16)
- Class C: 192 - 223 with a mask of 255.255.255.0 (/24)
IPV6 : /64
IPV4 : /32 IPV6 : /128
IPNetworkdefaultParse=IPNetwork.Parse("192.168.0.0");// default to ClassFullIPNetworkclassFullParse=IPNetwork.Parse("192.168.0.0",CidrGuess.ClassFull);IPNetworkclassLessParse=IPNetwork.Parse("192.168.0.0",CidrGuess.ClassLess);Console.WriteLine("IPV4 Default Parse : {0}",defaultStrategy);Console.WriteLine("IPV4 ClassFull Parse : {0}",classFullParse);Console.WriteLine("IPV4 ClassLess Parse : {0}",classLessParse);Output
IPV4Default Parse : 192.168.0.0/24IPV4ClassFull Parse : 192.168.0.0/24IPV4ClassLess Parse : 192.168.0.0/32IPNetworkdefaultParse=IPNetwork.Parse("::1");// default to ClassFullIPNetworkclassFullParse=IPNetwork.Parse("::1",CidrGuess.ClassFull);IPNetworkclassLessParse=IPNetwork.Parse("::1",CidrGuess.ClassLess);Console.WriteLine("IPV6 Default Parse : {0}",defaultParse);Console.WriteLine("IPV6 ClassFull Parse : {0}",classFullParse);Console.WriteLine("IPV6 ClassLess Parse : {0}",classLessParse);Output
IPV6Default Parse : ::/64IPV6ClassFullParse : ::/64IPV6ClassLessParse : ::1/128IPNetwork utility command line take care of complex network, ip, netmask, subnet, cidr calculation for command line. It works with IPv4, it is written in C# and has a light and clean API and is fully unit tested.
Below some examples :
Provideatleastoneipnetwork
Usage: ipnetwork[-inmcbflu][-dcidr|-D][-h|-scidr|-S|-w|-W|-x|-Cnetwork|-onetwork]networks ...
Version: 2.0.1.0Printoptions-i : network-n : networkaddress-m : netmask-c : cidr-b : broadcast-f : firstusableipaddress-l : lastusableipaddress-u : numberofusableipaddresses-t : totalnumberofipaddressesParseoptions-d cidr : usecidrifnotprovided(default/32)-D : IPv4only-usedefaultcidr(ClassA/8,ClassB/16,ClassC/24)Actions-h : helpmessage-s cidr : splitnetworkintocidrsubnets-w : supernetnetworksintosmallestpossiblesubnets-W : supernetnetworksintoonesinglesubnet-x : listallipadressesinnetworks-C network : networkcontainnetworks-o network : networkoverlapnetworks-S network : substractnetworkfromsubnet
networks : oneormorenetworkaddresses(1.2.3.410.0.0.0/810.0.0.0/255.0.0.02001:db8::/322001:db8:1:2:3:4:5:6/128)Display ipnetwork informations :
c:\> ipnetwork10.0.0.0/8
IPNetwork : 10.0.0.0/8
Network : 10.0.0.0
Netmask : 255.0.0.0
Cidr : 8
Broadcast : 10.255.255.255
FirstUsable : 10.0.0.1
LastUsable : 10.255.255.254
Usable : 16777214Split network into cidr
c:\> ipnetwork-s910.0.0.0/8
IPNetwork : 10.0.0.0/9
Network : 10.0.0.0
Netmask : 255.128.0.0
Cidr : 9
Broadcast : 10.127.255.255
FirstUsable : 10.0.0.1
LastUsable : 10.127.255.254
Usable : 8388606--IPNetwork : 10.128.0.0/9
Network : 10.128.0.0
Netmask : 255.128.0.0
Cidr : 9
Broadcast : 10.255.255.255
FirstUsable : 10.128.0.1
LastUsable : 10.255.255.254
Usable : 8388606supernet networks into smallest possible subnets
C:\>ipnetwork-w192.168.0.0/24192.168.1.0/24
IPNetwork : 192.168.0.0/23
Network : 192.168.0.0
Netmask : 255.255.254.0
Cidr : 23
Broadcast : 192.168.1.255
FirstUsable : 192.168.0.1
LastUsable : 192.168.1.254
Usable : 510supernet networks into smallest possible subnets
c:\> ipnetwork-w192.168.0.0/24192.168.2.0/24
IPNetwork : 192.168.0.0/24
Network : 192.168.0.0
Netmask : 255.255.255.0
Cidr : 24
Broadcast : 192.168.0.255
FirstUsable : 192.168.0.1
LastUsable : 192.168.0.254
Usable : 254--IPNetwork : 192.168.2.0/24
Network : 192.168.2.0
Netmask : 255.255.255.0
Cidr : 24
Broadcast : 192.168.2.255
FirstUsable : 192.168.2.1
LastUsable : 192.168.2.254
Usable : 254supernet networks into smallest possible subnets
C:\>ipnetwork-W192.168.0.0/24192.168.129.0/24
IPNetwork : 192.168.0.0/16
Network : 192.168.0.0
Netmask : 255.255.0.0
Cidr : 16
Broadcast : 192.168.255.255
FirstUsable : 192.168.0.1
LastUsable : 192.168.255.254
Usable : 65534Split network into cidr, display full network only
C:\>ipnetwork-i-s1210.0.0.0/8|grep-v \-\-
IPNetwork : 10.0.0.0/12
IPNetwork : 10.16.0.0/12
IPNetwork : 10.32.0.0/12
IPNetwork : 10.48.0.0/12
IPNetwork : 10.64.0.0/12
IPNetwork : 10.80.0.0/12
IPNetwork : 10.96.0.0/12
IPNetwork : 10.112.0.0/12
IPNetwork : 10.128.0.0/12
IPNetwork : 10.144.0.0/12
IPNetwork : 10.160.0.0/12
IPNetwork : 10.176.0.0/12
IPNetwork : 10.192.0.0/12
IPNetwork : 10.208.0.0/12
IPNetwork : 10.224.0.0/12
IPNetwork : 10.240.0.0/12Test if an ip is contained in a network
C:\>ipnetwork-C10.0.0.110.0.0.0/810.0.1.0/2410.0.0.1/32contains10.0.0.0/8 : False10.0.0.1/32contains10.0.1.0/24 : FalseTest if a network overlap another network
C:\>ipnetwork-o10.0.0.1/2410.0.0.0/810.0.1.0/2410.0.0.0/24overlaps10.0.0.0/8 : True10.0.0.0/24overlaps10.0.1.0/24 : Falseremove one ip from a class and regroup them into the smallest possible network
C:\> ipnetwork-i-s32192.168.0.0/24 \
|grep-v \-\- \
|awk"{print $3;}" \
|grep-v192.168.0.213/32 \
|xargsipnetwork-i-w \
|grep-v \-\-
IPNetwork : 192.168.0.224/27
IPNetwork : 192.168.0.216/29
IPNetwork : 192.168.0.214/31
IPNetwork : 192.168.0.212/32
IPNetwork : 192.168.0.208/30
IPNetwork : 192.168.0.192/28
IPNetwork : 192.168.0.128/26
IPNetwork : 192.168.0.0/25IPv6 networks
C:\> ipnetwork.exe2001:0db8::/128IPNetwork : 2001:db8::/128Network : 2001:db8::
Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
Cidr : 128
Broadcast : 2001:db8::
FirstUsable : 2001:db8::
LastUsable : 2001:db8::
Usable : 0
Total : 1Have fun !