サブネットマスクに従って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でない場合はどちらも同じネットワークにあります。
サブネットマスクに従って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でない場合はどちらも同じネットワークにあります。
シンプル:mask & ip1 == mask & ip2
- IPをすべて単一の数字として解釈する必要がありますが、それは明らかです。
この方法で試してみてください:
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
このソリューションは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);
}
しかし、マスクを取得するには?これはIPv6でも使えますか? – xZise
@xZiseマスクはあなたのサブネットマスクです。そして、IPv6と同じようにうまくいくでしょう - IPv4と比べると違う表記です。しかし最後に、サブネットマスクを使用してIPのネットワーク部分をマスクし、それらを互いに比較するだけです。 – Voo
しかし、プログラム自体からサブネットマスクを取得するには? – xZise