Projektdateien hinzufügen.
This commit is contained in:
382
Networking/IPTool.cs
Normal file
382
Networking/IPTool.cs
Normal file
@@ -0,0 +1,382 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
|
||||
namespace NetCalc
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for IPTool.
|
||||
/// </summary>
|
||||
public class IPTool
|
||||
{
|
||||
// first (0x00) only for fill - so array starts with bit 1
|
||||
static byte[] bit = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, (byte)0x80 };
|
||||
|
||||
protected string ip = null;
|
||||
protected byte[] ipBytes = null;
|
||||
//protected byte a,b,c,d;
|
||||
protected int networkPrefix; // z.b. 24 for /24
|
||||
protected bool firstSubNetBit = false;
|
||||
|
||||
public IPTool(string ip)
|
||||
{
|
||||
this.setIp(ip);
|
||||
}
|
||||
|
||||
public static byte getBit(int bit)
|
||||
{
|
||||
byte r = 0;
|
||||
if (bit >= 1 && bit <= 8)
|
||||
r = IPTool.bit[bit];
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
public static byte setBit(byte b, int bit)
|
||||
{
|
||||
if (bit >= 1 && bit <= 8)
|
||||
return (byte)(b | IPTool.bit[bit]);
|
||||
else return 0;
|
||||
}
|
||||
|
||||
public static bool isBitSet(byte b, int bit)
|
||||
{
|
||||
bool r = false;
|
||||
if (bit >= 1 && bit <= 8)
|
||||
r = ((b & IPTool.bit[bit]) != 0);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* return true if domainName is an IP
|
||||
*/
|
||||
static public bool isIP(String domainName)
|
||||
{
|
||||
//if (domainName.matches("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"))
|
||||
if (domainName.Equals("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"))
|
||||
return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Converts (unsigned)byte to int
|
||||
*/
|
||||
public static int byte2int(byte b)
|
||||
{
|
||||
int i = b;
|
||||
if (b < 0) i = b & 0x7f + 128;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
// return first byte of IP
|
||||
public byte get1Byte()
|
||||
{
|
||||
return this.ipBytes[0];
|
||||
}
|
||||
|
||||
// return second byte of IP
|
||||
public byte get2Byte()
|
||||
{
|
||||
return this.ipBytes[1];
|
||||
}
|
||||
|
||||
// return third byte of IP
|
||||
public byte get3Byte()
|
||||
{
|
||||
return this.ipBytes[2];
|
||||
}
|
||||
|
||||
// return fourth byte of IP
|
||||
public byte get4Byte()
|
||||
{
|
||||
return this.ipBytes[3];
|
||||
}
|
||||
|
||||
// return array with all bytes of IP
|
||||
public byte[] getBytes()
|
||||
{
|
||||
//return InetAddress.getByName(this.ip).getAddress();
|
||||
//return Dns.GetHostByName(this.ip).AddressList;
|
||||
return IPAddress.Parse(this.ip).GetAddressBytes();
|
||||
}
|
||||
|
||||
public String getIp()
|
||||
{
|
||||
return this.ip;
|
||||
}
|
||||
|
||||
public void setIp(String ip)
|
||||
{
|
||||
this.ip = ip;
|
||||
this.ipBytes = getBytes();
|
||||
this.setPrefix2NetworkClassPrefix();
|
||||
}
|
||||
|
||||
public void setPrefix2NetworkClassPrefix()
|
||||
{
|
||||
this.setNetworkPrefix(this.getNetworkClassPrefix());
|
||||
}
|
||||
|
||||
public int getNetworkClassPrefix()
|
||||
{
|
||||
// set network-prefix with Class-Type
|
||||
int netClass = getNetworkClass();
|
||||
switch (netClass)
|
||||
{
|
||||
case 0: return 8; // Class A
|
||||
case 1: return 16; // Class B
|
||||
case 2: return 24; // Class C
|
||||
//default: setNetworkPrefix(-1); // other Classes have no default Prefix
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* return -1 if out of range (0-255) or other error
|
||||
*/
|
||||
private int convertIPByte(String ipByte)
|
||||
{
|
||||
//int res = Integer.valueOf(ipByte).intValue();
|
||||
int res = Int32.Parse(ipByte);
|
||||
if (res < 0 || res > 255)
|
||||
{
|
||||
res = -1;
|
||||
this.ip = null;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getNetworkPrefix()
|
||||
{
|
||||
return this.networkPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param prefix
|
||||
*/
|
||||
public void setNetworkPrefix(int prefix)
|
||||
{
|
||||
this.networkPrefix = prefix;
|
||||
}
|
||||
|
||||
public String getNetworkClassName()
|
||||
{
|
||||
switch (this.getNetworkClass())
|
||||
{
|
||||
case 0: return "Class A";
|
||||
case 1: return "Class B";
|
||||
case 2: return "Class C";
|
||||
case 3: return "Class D/Multicast";
|
||||
case 4: return "Class E/not used";
|
||||
default: return "error";
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 0=Class A
|
||||
* 1=Class B
|
||||
* 2=Class C
|
||||
* 3=Class D
|
||||
* 4=Class E
|
||||
* -1=error
|
||||
*/
|
||||
public int getNetworkClass()
|
||||
{
|
||||
// Test Class A: first bit=0
|
||||
if (!IPTool.isBitSet(this.get1Byte(), 8)) return 0;
|
||||
// Test Class B: first 2bit=10
|
||||
else if (!IPTool.isBitSet(this.get1Byte(), 7)) return 1;
|
||||
// Test Class C: first 3bit=110
|
||||
else if (!IPTool.isBitSet(this.get1Byte(), 6)) return 2;
|
||||
// Test Class D: first 4bit=1110
|
||||
else if (!IPTool.isBitSet(this.get1Byte(), 5)) return 3;
|
||||
// Test Class E: first 4bit=1111 ( = all other)
|
||||
// else if (!IPTool.isBitSet(this.get1Byte(),8)) return 4;
|
||||
else return 4;
|
||||
|
||||
|
||||
/*
|
||||
// Test Class A: first bit=0
|
||||
if ((this.get1Byte() | (byte)0x7f) == (byte)0x7f) return 0;
|
||||
// Test Class B: first 2bit=10
|
||||
if ((this.get1Byte() | 0xbf) == 0xbf) return 1;
|
||||
// Test Class C: first 3bit=110
|
||||
if ((this.get1Byte() | 0xdf) == 0xdf) return 2;
|
||||
// Test Class D: first 4bit=1110
|
||||
if ((this.get1Byte() | 0xef) == 0xef) return 3;
|
||||
// Test Class E: first 4bit=1111
|
||||
if ((this.get1Byte() & 0xf0) == 0xf0) return 4;
|
||||
return -1;
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
public String getNetworkMask()
|
||||
{
|
||||
return getNetworkMaskByPrefix(this.networkPrefix);
|
||||
}
|
||||
|
||||
public String getNetworkMaskByPrefix(int prefix)
|
||||
{
|
||||
switch (prefix)
|
||||
{
|
||||
case 8: return "255.0.0.0";
|
||||
case 9: return "255.128.0.0";
|
||||
case 10: return "255.192.0.0";
|
||||
case 11: return "255.224.0.0";
|
||||
case 12: return "255.240.0.0";
|
||||
case 13: return "255.248.0.0";
|
||||
case 14: return "255.252.0.0";
|
||||
case 15: return "255.254.0.0";
|
||||
case 16: return "255.255.0.0";
|
||||
case 17: return "255.255.128.0";
|
||||
case 18: return "255.255.192.0";
|
||||
case 19: return "255.255.224.0";
|
||||
case 20: return "255.255.240.0";
|
||||
case 21: return "255.255.248.0";
|
||||
case 22: return "255.255.252.0";
|
||||
case 23: return "255.255.254.0";
|
||||
case 24: return "255.255.255.0";
|
||||
case 25: return "255.255.255.128";
|
||||
case 26: return "255.255.255.192";
|
||||
case 27: return "255.255.255.224";
|
||||
case 28: return "255.255.255.240";
|
||||
case 29: return "255.255.255.248";
|
||||
case 30: return "255.255.255.252";
|
||||
default: return "";
|
||||
}
|
||||
}
|
||||
|
||||
public int getMaxNetworkHosts()
|
||||
{
|
||||
// 2^(32-networkprefix)
|
||||
// -2 ... because .0 and .255
|
||||
return ((int)Math.Pow(2, (32 - this.networkPrefix))) - 2;
|
||||
}
|
||||
|
||||
public int getMaxSubNets()
|
||||
{
|
||||
// Bits from Subnet = prefix-class_prefix
|
||||
|
||||
int count = (int)Math.Pow(2, this.networkPrefix - this.getNetworkClassPrefix());
|
||||
|
||||
// -2 because 1 bit for routing
|
||||
if (!this.isFirstSubNetBit() || this.getNetworkClassPrefix() == this.networkPrefix)
|
||||
count -= 2;
|
||||
|
||||
if (count < 0) count = 0;
|
||||
return count;
|
||||
}
|
||||
|
||||
public long getNetworkLong()
|
||||
{
|
||||
long mask = (long)Math.Pow(2, this.networkPrefix) - 1;
|
||||
mask = mask << (32 - this.networkPrefix);
|
||||
|
||||
return (mask & ip2Long());
|
||||
}
|
||||
|
||||
public String getNetwork()
|
||||
{
|
||||
return long2String(getNetworkLong());
|
||||
}
|
||||
|
||||
public long getBroadCastLong()
|
||||
{
|
||||
long netMask = (long)Math.Pow(2, this.networkPrefix) - 1;
|
||||
netMask = netMask << (32 - this.networkPrefix);
|
||||
long hostMask = (long)Math.Pow(2, 32 - this.networkPrefix) - 1;
|
||||
|
||||
return (netMask = (ip2Long() & netMask) | hostMask);
|
||||
}
|
||||
|
||||
public String getBroadCast()
|
||||
{
|
||||
return long2String(getBroadCastLong());
|
||||
}
|
||||
|
||||
|
||||
public String[] getNetworkIPRange()
|
||||
{
|
||||
String[] result = new String[2];
|
||||
//String from, to;
|
||||
/**
|
||||
* Start
|
||||
* +1 because first = network
|
||||
*/
|
||||
result[0] = long2String(getNetworkLong() + 1);
|
||||
/**
|
||||
* End
|
||||
* -1 because last = broadcast
|
||||
*/
|
||||
result[1] = long2String(getBroadCastLong() - 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
public long ip2Long()
|
||||
{
|
||||
return ((long)(IPTool.byte2int(this.get1Byte()) * 256 +
|
||||
IPTool.byte2int(this.get2Byte())) * 256 +
|
||||
IPTool.byte2int(this.get3Byte())) * 256 +
|
||||
IPTool.byte2int(this.get4Byte());
|
||||
}
|
||||
|
||||
public String long2String(long ip)
|
||||
{
|
||||
long a = (long)(ip & 0xff000000) >> 24;
|
||||
long b = (long)(ip & 0x00ff0000) >> 16;
|
||||
long c = (long)(ip & 0x0000ff00) >> 8;
|
||||
long d = (long)(ip & 0xff);
|
||||
|
||||
return a + "." + b + "." + c + "." + d;
|
||||
}
|
||||
|
||||
public bool isFirstSubNetBit()
|
||||
{
|
||||
return firstSubNetBit;
|
||||
}
|
||||
|
||||
public void setFirstSubNetBit(bool b)
|
||||
{
|
||||
firstSubNetBit = b;
|
||||
}
|
||||
|
||||
public static IPTool getNextIP(String ip)
|
||||
{
|
||||
IPTool nextIp = new IPTool(ip);
|
||||
nextIp.setIp(nextIp.long2String(nextIp.ip2Long() + (long)1));
|
||||
|
||||
return nextIp;
|
||||
|
||||
}
|
||||
|
||||
public IPTool getNextSubNet(long numberOfHosts)
|
||||
{
|
||||
IPTool ip = IPTool.getNextIP(this.getBroadCast());
|
||||
ip.setIp(this.long2String(ip.ip2Long() + (long)1));
|
||||
ip.setFirstSubNetBit(this.isFirstSubNetBit());
|
||||
|
||||
int lastPrefix = ip.getNetworkClassPrefix();
|
||||
|
||||
int prefix = 30;
|
||||
do
|
||||
{
|
||||
if (prefix < ip.getNetworkClassPrefix())
|
||||
return null; // no subnet found
|
||||
ip.setNetworkPrefix(prefix);
|
||||
prefix--;
|
||||
// ignore subnetbit?
|
||||
if (!ip.isFirstSubNetBit() && prefix == lastPrefix + 1) prefix--;
|
||||
|
||||
}
|
||||
while (ip.getMaxNetworkHosts() < numberOfHosts);
|
||||
|
||||
return ip;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user