2つのIPが同じネットワークにある場合にJavaでテストする

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

例えば、私は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でない場合

8

3 答え

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

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;

}

そして、次のように使用してください:

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

編集:

すでにIPを InetAddress オブジェクトとして使用している場合は、次のようにします。

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;

}
14
追加された
良い解決策 - 自分で文字列を解析する必要がありません。
追加された 著者 Voo,
@xZise私はあなたの最後のコメントにマッチするように私の答えを編集しました。すべての比較でマスクが同じであれば、byte []アドレスを1回だけ計算して再利用するほうがよいでしょう
追加された 著者 Óscar López,
私はIP自体を既にInetAddressesとして持っているので、たいていマスクを解析する必要があります。
追加された 著者 xZise,

Simple enough: mask & ip1 == mask & ip2 - you have to interpret the IPs all as a single number for that but that should be obvious.

5
追加された
@xZiseマスクはあなたのサブネットマスクです。そして、IPv6と同じようにうまくいくでしょう - IPv4と比べると違う表記です。しかし最後に、サブネットマスクを使用してIPのネットワーク部分をマスクし、それらを互いに比較するだけです。
追加された 著者 Voo,
@xZiseごめんなさいあなたの質問を理解できません。 2つのIPが同じネット内にあるように、最も特定のサブネットマスクが必要ですか?サブネットマスクのない他のケースでは、結局2つのIPが同じネット内にあるかどうかという質問に答えることはできません(結局マスクに依存します)。
追加された 著者 Voo,
@ xZise InetAddressはその情報を格納しているとは思わないが、たとえそれがあったとしても、情報そのものはどこにあるのだろうか?あなたはその情報をユーザから入手する必要があります(彼女の設定 - ローカルプロセスならOSの情報を読むことができます)。
追加された 著者 Voo,
しかし、どのようにマスクを取得するには?これはIPv6でも使えますか?
追加された 著者 xZise,
しかし、プログラム自体からサブネットマスクを取得するには?
追加された 著者 xZise,
ユーザーに尋ねることなくサブネットマスクを決定する方法はありませんか?
追加された 著者 xZise,

このソリューションは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>>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);
}
0
追加された