2010-12-29 8 views
4

コンピュータが(実際に複数の)ネットワークに接続されていると仮定します。C#でIPアドレスを取得するには?

コンピュータにネットワーク内のすべてのIPアドレスを含むIPアドレスのリストを取得できますが、IPアドレスがどのネットワークに属しているかをどのように知ることができますか?

答えて

4

まず、いくつかの用語を知っておく必要があります。これらの例の数字は、IPv4ネットワークを想定しています。

  • IPアドレス(192.168.1.1)
  • サブネットマスク(255.255.255.0)
  • ネットワークアドレス(192.168.1.0)
  • ネットワークインターフェイスカード、NIC(1枚のハードウェア・カードは、これらのいくつかを有していてもよいです)

IPアドレスが属するネットワークを確認するには、ネットワークアドレスを計算する必要があります。 IPアドレス(Byte [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); 
     } 
    } 
} 

などVPN接続が255.255.255.255のサブマスクを有することができることあなたが同じネットワーク上に複数のIPアドレスを持つことができます注、(そのネットワークアドレス== IPアドレス)、

関連する問題