如何验证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}");
}
}
}
}