尝试仅在本地子网上进行端口扫描

时间:2015-10-17 01:35:36

标签: java networking ip port subnet

目前我有一个工作端口扫描程序,但我想将其限制为只扫描本地子网上的IP地址。

我在挖掘时发现的唯一解决方案是: Does anyone know a java component to check if IP address is from particular network/netmask?但是我不完全明白

子网和网络掩码有什么区别?我以为他们是一回事?

其次,我如何找到localHost的子网和网络掩码的值?

到目前为止,这就是我所拥有的

NetworkInterface network = NetworkInterface.getByInetAddress(localHost);
short subnetMask = 
network.getInterfaceAddresses().get(1).getNetworkPrefixLength();

但这是网络掩码还是子网?我如何获得其他价值?

1 个答案:

答案 0 :(得分:0)

您确定的subnetMask是网络中的位数。通过将掩码中的位之后的地址中的所有位设置为零来找到网络地址。此代码应以通常的形式打印掩码和网络地址。

NetworkInterface network = NetworkInterface.getByInetAddress(localhost);
short subnetMask
        = network.getInterfaceAddresses().get(1).getNetworkPrefixLength();
int address_int = ByteBuffer.wrap(localhost.getAddress()).getInt();
int mask_int = 0;
for(int i = 0; i < subnetMask-1; i++) {
    mask_int = mask_int | (1<<31);
    mask_int = mask_int >> 1;
}
byte mask_bytes[] =  ByteBuffer.allocate(4).putInt(mask_int).array();
InetAddress mask_address = InetAddress.getByAddress(mask_bytes);
System.out.println("mask_address = " + mask_address);
int network_int = mask_int & address_int;
byte network_bytes[] =  ByteBuffer.allocate(4).putInt(network_int).array();
InetAddress network_address = InetAddress.getByAddress(network_bytes);
System.out.println("network_address = " + network_address);

您可以使用network_mask整数使用按位和整数形式的地址来测试此网络上是否有任何地址。如果它在网络上,则应生成address_int。