IP、网关、子网掩码的验证逻辑及程序(.Net)

如何验证IP、网关、子网掩码的验证逻辑及程序(.Net)是否在同一个网段内,其原理简单来说就是,分别获通过IP和子网掩码获取网络地址,网关和子网掩码获取网路地址,将两个网络地址进行比对,验证是否一致,一致则是同一网段可以通讯。

获取网络地址的方式,则是通过将IP、网关、子网掩码分别转化为二进制,取&值即可获得网络地址。

C# 复制代码
using System;
using System.Net;
using System.Net.NetworkInformation;

class Program
{
    static void Main()
    {
        string ipString = "192.168.2.10"; // 要验证的IP地址  
        string subnetMaskString = "255.255.252.0"; // 子网掩码  
        string gatewayString = "192.168.1.1"; // 网关  


        Console.WriteLine($"IP的二进制:{PrintIpAddressInBinary(ipString)}");
        Console.WriteLine($"网关的二进制:{PrintIpAddressInBinary(gatewayString)}");
        Console.WriteLine($"子网掩码的二进制:{PrintIpAddressInBinary(subnetMaskString)}");


        IPAddress ip = IPAddress.Parse(ipString);
        IPAddress subnetMask = IPAddress.Parse(subnetMaskString);
        IPAddress gateway = IPAddress.Parse(gatewayString);

        // 计算网络地址  
        IPAddress networkAddress = GetNetworkAddress(ip, subnetMask);

        Console.WriteLine($"IP的网络地址:{networkAddress} ,二进制:{PrintIpAddressInBinary(networkAddress.ToString())}");

        // 计算网关的网络地址  
        IPAddress gatewayNetworkAddress = GetNetworkAddress(gateway, subnetMask);

        Console.WriteLine($"网关的网络地址  :{gatewayNetworkAddress} ,二进制:{PrintIpAddressInBinary(gatewayNetworkAddress.ToString())}");

        // 输出结果  
        if (networkAddress.Equals(gatewayNetworkAddress))
        {
            Console.WriteLine("IP、子网掩码和网关在同一网段,后续可以进行通讯测试。");
            // 测试通讯  
            TestPing(gateway);
        }
        else
        {
            Console.WriteLine("IP、子网掩码和网关不在同一网段。");
        }
    }

    static IPAddress GetNetworkAddress(IPAddress ip, IPAddress subnetMask)
    {
        byte[] ipBytes = ip.GetAddressBytes();
        byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
        byte[] networkAddressBytes = new byte[ipBytes.Length];

        for (int i = 0; i < ipBytes.Length; i++)
        {
            networkAddressBytes[i] = (byte)(ipBytes[i] & subnetMaskBytes[i]);
        }

        return new IPAddress(networkAddressBytes);
    }

    // 方法:打印 IP 地址的二进制表示  
    static string PrintIpAddressInBinary(string ipString)
    {
        var sb = new StringBuilder();
        IPAddress ipAddress = IPAddress.Parse(ipString); // 将字符串转换为 IPAddress 对象  

        // 获取 IP 地址的字节数组  
        byte[] ipBytes = ipAddress.GetAddressBytes();


        for (int i = 0; i < ipBytes.Length; i++)
        {
            // 将当前字节转换为二进制字符串并补充至8位  
            string binaryString = Convert.ToString(ipBytes[i], 2).PadLeft(8, '0');
            sb.Append(binaryString);
            if (i < ipBytes.Length - 1)
            {
                sb.Append(".");
            }
        }
        return sb.ToString();
    }

    static void TestPing(IPAddress ipAddress)
    {
        using (Ping ping = new Ping())
        {
            try
            {
                PingReply reply = ping.Send(ipAddress);
                if (reply.Status == IPStatus.Success)
                {
                    Console.WriteLine($"成功与 {ipAddress} 通讯。");
                }
                else
                {
                    Console.WriteLine($"未能与 {ipAddress} 通讯: {reply.Status}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"通讯过程中发生错误: {ex.Message}");
            }
        }
    }
}
相关推荐
葡萄皮sandy14 分钟前
SSE和WebSocket
网络·websocket·网络协议
酉鬼女又兒22 分钟前
零基础入门计算机网络网际层核心:IP数据报发送与转发完整流程、静态路由配置方法、路由环路成因与解决方案及历年考研经典例题深度解析
网络·tcp/ip·计算机网络·考研·职场和发展
qq_195821651 小时前
6. 应用层协议实现:CoE协议栈集成、对象字典配置、PDO映射
java·服务器·网络
程序猿零零漆1 小时前
Python核心进阶三连:闭包装饰器、深浅拷贝、网络编程从原理到实战
网络·python
袖手蹲1 小时前
K10 百炼 AI 语音助手从网络配置到全链路语音交互的嵌入式实战
网络·人工智能·交互
liulilittle1 小时前
KCC: An Exploration Along the Lines of BBR
网络·tcp/ip·计算机网络·bbr·通信·拥塞控制·kcc
星野爱8952 小时前
云顶之弈7周年新版本!手机随时随地畅玩周年时光机派对
网络·智能手机·电脑
AI科技星2 小时前
第六卷:量天尺传奇(几何学)
网络·人工智能·算法·概率论·学习方法·几何学·拓扑学
酉鬼女又兒2 小时前
零基础入门IPv4地址:从基本概念、分类编址、子网划分到无分类编址与应用规划全解
网络·网络协议·计算机网络·考研·职场和发展·分类·智能路由器
未来侦察班2 小时前
网络协议 数据链路层,“帧”建立统一新秩序
网络·网络协议