2011-12-19 5 views
8

サブネットマスクに従って2つのIPが同じネットワークにあるかどうかをテストするにはどうすればよいですか?2つのIPが同じネットワークにある場合のJavaでのテスト

たとえば、私はIP 1.2.3.4と1.2.4.3を持っています。マスクが255.0.0.0または255.255.0.0でも255.255.248.0でも同じネットワークにありますが、マスクが255.255.255.0でない場合はどちらも同じネットワークにあります。

答えて

5

シンプル:mask & ip1 == mask & ip2 - IPをすべて単一の数字として解釈する必要がありますが、それは明らかです。

+0

しかし、マスクを取得するには?これはIPv6でも使えますか? – xZise

+0

@xZiseマスクはあなたのサブネットマスクです。そして、IPv6と同じようにうまくいくでしょう - IPv4と比べると違う表記です。しかし最後に、サブネットマスクを使用してIPのネットワーク部分をマスクし、それらを互いに比較するだけです。 – Voo

+0

しかし、プログラム自体からサブネットマスクを取得するには? – xZise

14

この方法で試してみてください:

public static boolean sameNetwork(String ip1, String ip2, String mask) 
throws Exception { 

    byte[] a1 = InetAddress.getByName(ip1).getAddress(); 
    byte[] a2 = InetAddress.getByName(ip2).getAddress(); 
    byte[] m = InetAddress.getByName(mask).getAddress(); 

    for (int i = 0; i < a1.length; i++) 
     if ((a1[i] & m[i]) != (a2[i] & m[i])) 
      return false; 

    return true; 

} 

をそして、このようにそれを使用します。

public static boolean sameNetwork(InetAddress ip1, InetAddress ip2, String mask) 
throws Exception { 

    byte[] a1 = ip1.getAddress(); 
    byte[] a2 = ip2.getAddress(); 
    byte[] m = InetAddress.getByName(mask).getAddress(); 

    for (int i = 0; i < a1.length; i++) 
     if ((a1[i] & m[i]) != (a2[i] & m[i])) 
      return false; 

    return true; 

} 
:あなたはすでに InetAddressオブジェクトとしてIPアドレスを持っている場合は

sameNetwork("1.2.3.4", "1.2.4.3", "255.255.255.0") 
> false 

EDIT

+0

良い解決策 - 自分で文字列を解析する必要がありません。 – Voo

+0

私はIP自体をInetAddressesとして既に持っているので、ほとんどの場合、マスクを解析する必要があります。 – xZise

+0

@xZiseあなたの最後のコメントにマッチするように私の答えを編集しました。すべての比較でマスクが同じであれば、byte []アドレスを1回だけ計算して再利用するほうがよいでしょう –

0

このソリューションはIPv4/IPv6でも動作します。

static boolean sameNetwork(final byte[] x, final byte[] y, final int mask) { 
    if(x == y) return true; 
    if(x == null || y == null) return false; 
    if(x.length != y.length) return false; 
    final int bits = mask & 7; 
    final int bytes = mask >>> 3; 
    for(int i=0;i<bytes;i++) if(x[i] != y[i]) return false; 
    final int shift = 8 - bits; 
    if(bits != 0 && x[bytes]>>>shift != y[bytes]>>>shift) return false; 
    return true; 
} 
static boolean sameNetwork(final InetAddress a, final InetAddress b, final int mask) { 
    return sameNetwork(a.getAddress(), b.getAddress(), mask); 
} 
関連する問題