假设一台计算机连接到许多网络(实际上不止一个)。
我可以获得一个IP地址列表,其中包括计算机在网络中拥有的所有IP地址,但是我如何知道某个IP地址属于哪个网络呢?
首先,您需要了解一些术语。这些示例数字假定 IPv4 网络。
- IP地址(192.168.1.1)
- 子网掩码 (255.255.255.0)
- 网络地址(192.168.1.0)
- 网络接口卡、NIC(一个硬件卡可能有多个)
要查看 IP 地址属于哪个网络,需要计算网络地址。如果您获取 IP 地址(Byte[4] 或 UInt64),并将其与子网掩码按位“与”,这很容易。
using System;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace ConsoleApplication {
public static class ConsoleApp {
public static void Main() {
var nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (var nic in nics) {
var ipProps = nic.GetIPProperties();
// We're only interested in IPv4 addresses for this example.
var ipv4Addrs = ipProps.UnicastAddresses
.Where(addr => addr.Address.AddressFamily == AddressFamily.InterNetwork);
foreach (var addr in ipv4Addrs) {
var network = CalculateNetwork(addr);
if (network != null)
Console.WriteLine("Addr: {0} Mask: {1} Network: {2}", addr.Address, addr.IPv4Mask, network);
}
}
}
private static IPAddress CalculateNetwork(UnicastIPAddressInformation addr) {
// The mask will be null in some scenarios, like a dhcp address 169.254.x.x
if (addr.IPv4Mask == null)
return null;
var ip = addr.Address.GetAddressBytes();
var mask = addr.IPv4Mask.GetAddressBytes();
var result = new Byte[4];
for (int i = 0; i < 4; ++i) {
result[i] = (Byte)(ip[i] & mask[i]);
}
return new IPAddress(result);
}
}
}
请注意,同一网络上可以有多个 IP 地址,即VPN连接的子掩码可能为 255.255.255.255(因此网络地址 == IP 地址)等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)