如何在C#中获取IP地址?

如何在C#中获取IP地址?,c#,.net,network-programming,system.net,C#,.net,Network Programming,System.net,假设一台计算机连接到多个网络(实际上不止一个) 我可以得到一个IP地址列表,其中包括计算机在网络中的所有IP地址,但我如何知道IP地址属于哪个网络?首先,您需要知道一些术语。这些示例数字假定为IPv4网络 IP地址(192.168.1.1) 子网掩码(255.255.255.0) 网络地址(192.168.1.0) 网络接口卡,NIC(一个硬件卡可能有多个) 要查看IP地址属于哪个网络,需要计算网络地址。如果您使用IP地址(字节[4]或UInt64),并将其与子网掩码按位“and”匹配,则很

假设一台计算机连接到多个网络(实际上不止一个)


我可以得到一个IP地址列表,其中包括计算机在网络中的所有IP地址,但我如何知道IP地址属于哪个网络?

首先,您需要知道一些术语。这些示例数字假定为IPv4网络

  • IP地址(192.168.1.1)
  • 子网掩码(255.255.255.0)
  • 网络地址(192.168.1.0)
  • 网络接口卡,NIC(一个硬件卡可能有多个)
要查看IP地址属于哪个网络,需要计算网络地址。如果您使用IP地址(字节[4]或UInt64),并将其与子网掩码按位“and”匹配,则很容易实现这一点

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);
        }
    }
}
使用系统;
使用System.Linq;
Net系统;
使用System.Net.NetworkInformation;
使用System.Net.Sockets;
命名空间控制台应用程序{
公共静态类控制台{
公共静态void Main(){
var nics=NetworkInterface.GetAllNetworkInterfaces();
foreach(nic中的变量nic){
var ipProps=nic.GetIPProperties();
//对于本例,我们只对IPv4地址感兴趣。
var ipv4Addrs=ipProps.unicastaddress
其中(addr=>addr.Address.AddressFamily==AddressFamily.InterNetwork);
foreach(ipv4Addrs中的var addr){
var网络=计算网络(addr);
if(网络!=null)
Console.WriteLine(“地址:{0}掩码:{1}网络:{2}”,地址,地址IPv4Mask,网络);
}
}
}
专用静态IP地址计算网络(UnicastIPAddressInformation地址){
//在某些情况下,掩码将为空,例如dhcp地址169.254.x.x
如果(addr.IPv4Mask==null)
返回null;
var ip=addr.Address.GetAddressBytes();
var mask=addr.IPv4Mask.GetAddressBytes();
var结果=新字节[4];
对于(int i=0;i<4;++i){
结果[i]=(字节)(ip[i]&掩码[i]);
}
返回新的IP地址(结果);
}
}
}
请注意,在同一网络上可以有多个IP地址,连接的子掩码可能为255.255.255.255(因此网络地址==IP地址),等等