一、IP地址由第一个八位组的值来确定,任何一个0到127 间的网络地址均是一个a类地址。任何一个128到191间的网络地址是一个b类地址。任何一个192到223 间的网络地址是一个c类地址。任何一个第一个八位组在224到239 间的网络地址是一个组播地址即d类地址,e类保留。
二、特殊的网址:
1、每个字节都为0的地址,对应当前主机。
2、IP地址中的每个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址。
3、IP地址中凡是以“11110”开头的E类IP地址都保留用于将来和实验使用。
4、IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.255.255.255用于回路测试。
三、具体校验示例如下
// 有效IP地址范围.
private static IPAddresRange ValidIPRange = new IPAddresRange(new byte[] { 0, 0, 0, 0 }, new byte[] { 223, 255, 255, 255 });
//无效IP地址范围
private static List InvalidIPList = new List()
{
new IPAddresRange(new byte[]{127,0,0,0}, new byte[]{127,255,255,255}),
};
//IP地址范围类
private class IPAddresRange
{
public byte[] Begin;
public byte[] End;
public IPAddresRange(byte[] begin, byte[] end)
{
Begin =begin;
End = end;
}
//判断IP地址在指定范围内
public bool IsInRange(byte[] ips)
{
if (Compare(ips, Begin) >= 0 && Compare(ips, End) <= 0)
{
return true;
}
return false;
}
//IP地址比较差异性
private int Compare(byte[] ip1, byte[] ip2)
{
for (int i = 0; i < 4; i ++)
{
if (ip1[i] != ip2[i])
{
return ((int)ip1[i] - ip2[i]);
}
}
return 0;
}
public override string ToString()
{
return string.Join(“.”, Begin.Select(b => b.ToString()).ToArray()) + string.Join(“.”, End.Select(b => b.ToString()).ToArray());
}
}
/是否有效IP地址, ABC类地址: 0.0.0.0 -127.255.255.255 除去 环回地址: 127.0.0.0 - 127.255.255.255/
public static bool IsValidIPAddress(IPAddress ip)
{
if (ip != null)
{
return IsValidIPAddress(ip.GetAddressBytes());
}
return false;
}
// 是否有效IP地址
public static bool IsValidIPAddress(byte[] ips)
{
if (ips != null && ips.Length == 4)
{
if (ValidIPRange.IsInRange(ips))
{
foreach (var range in InvalidIPList)
{
if (range.IsInRange(ips))
{
return false;
}
}
return true;
}
}
return false;
}
// 是否有效子网掩码
public static bool IsValidMask(IPAddress ip)
{
if (ip != null)
{
return IsValidMask(ip.GetAddressBytes());
}
return false;
}
public static bool IsValidMask(byte[] ip)
{
string str = “”;
foreach (byte b in ip)
{
str += Convert.ToString(b, 2);
}
//最后一个 1 的位置 相邻 第一个 0 的位置
return str.LastIndexOf(‘1’) + 1 == str.IndexOf(‘0’);
}
// 是否同一个网段
public static bool IsSameNetSegment(IPAddress ip, IPAddress mask, IPAddress ip2, IPAddress mask2)
{
if (ip != null && mask != null && ip2 != null && mask2 != null)
{
return IsSameNetSegment(ip.GetAddressBytes(), mask.GetAddressBytes(), ip2.GetAddressBytes(), mask2.GetAddressBytes());
}
return false;
}
// 是否同一个网络
public static bool IsSameNetSegment(byte[] ip, byte[] mask, byte[] ip2, byte[] mask2)
{
if (ip == null || ip.Length != 4 || mask == null || mask.Length != 4 || ip2 == null || ip2.Length != 4 || mask2 == null || mask2.Length != 4)
{
return false;
}
uint i1 = BitConverter.ToUInt32(ip, 0);
uint i2 = BitConverter.ToUInt32(ip2, 0);
uint m1 = BitConverter.ToUInt32(mask, 0);
uint m2 = BitConverter.ToUInt32(mask2, 0);
return ((i1 & m1) == (i2 & m2));
}
/// 是否消息可送达.
public static bool IsMessageArrive(IPAddress ip, IPAddress mask, IPAddress targetIP)
{
return IsSameNetSegment(ip, mask, targetIP, mask);
}
public static bool IsMessageArrive(byte[] ip, byte[] mask, byte[] targetIP)
{
return IsSameNetSegment(ip, mask, targetIP, mask);
}
//获取本地IP
public static IPAddress[] GetLocalIP()
{
ManagementClass mc = new ManagementClass(“Win32_NetworkAdapterConfiguration”);
ManagementObjectCollection nics = mc.GetInstances();
foreach (ManagementObject nic in nics)
{
if (Convert.ToBoolean(nic[“ipEnabled”]) == true)
{
return nic[“IPAddress”] as IPAddress[];
}
}
return null;
}
//获取指定IP的MAC地址
[DllImport("iphlpapi.dll ", ExactSpelling = true)]
public static extern int SendARP(Int32 DestIP, Int32 SrcIP, [Out] byte[] pMacAddr, ref IntPtr PhyAddrLen);
[DllImport("Ws2_32.dll ", CharSet = CharSet.Ansi)]
public static extern int inet_addr(string ip);
public static string GetRemoteMAC(IPAddress sourceIP, IPAddress remoteIP)
{
Int32 lhost = inet_addr(sourceIP.ToString());//本地服务器的ip
Int32 ldest = inet_addr(remoteIP.ToString()); //目的地的ip
try
{
Byte[] macinfo = new Byte[6];
IntPtr mac = new IntPtr(macinfo[0]);
IntPtr len = new IntPtr(6);
int ii = SendARP(ldest, lhost, macinfo, ref len);
return BitConverter.ToString(macinfo);
}
catch
{
return string.Empty;
}
}
public static bool GetPingResult(IPAddress desIP)
{
Ping ping = new Ping();
PingReply reply = ping.Send(desIP);
if (reply.Status == IPStatus.Success)
{
return true;
}
return false;
}
}
}