• 网络设置有效性检测之C#设计笔记(十七)


    一、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;
    }
    }
    }

  • 相关阅读:
    微服务系列之网关(二) konga配置操作
    C++基础语法——类和对象
    HTTP协议
    CentOS 7 安装 PostgreSQL12.2
    数据结构学习笔记——广义表、树和二叉树的基本知识
    【编程之路】面试必刷TOP101:动态规划(入门)(62-66,Python实现)
    TiDB 热点问题处理
    机器学习【逻辑回归算法】
    HTML静态网页作业——澳门英文旅游网站设计与实现HTML+CSS+JavaScript
    docker镜像详解
  • 原文地址:https://blog.csdn.net/weixin_48408892/article/details/127942727