如何使用java获取本地系统的子网掩码?

如何使用java获取本地系统的子网掩码?,java,networking,Java,Networking,如何使用Java获取本地系统的子网掩码地址?Java.net.InterfaceAddress在SE6中有一个getNetworkPrefixLength方法,该方法返回网络前缀长度,顾名思义。如果希望子网掩码采用该格式,则可以根据该格式计算子网掩码。同时支持IPv4和IPv6 几个网络应用程序API中的getSubnetMask()以java.net.InetAddress形式返回指定IP地址的子网掩码(本地系统可能有许多本地IP地址)本地主机接口的第一个地址的网络掩码: InetAddres

如何使用Java获取本地系统的
子网
掩码地址?

Java.net.InterfaceAddress在SE6中有一个getNetworkPrefixLength方法,该方法返回网络前缀长度,顾名思义。如果希望子网掩码采用该格式,则可以根据该格式计算子网掩码。同时支持IPv4和IPv6


几个网络应用程序API中的getSubnetMask()以java.net.InetAddress形式返回指定IP地址的子网掩码(本地系统可能有许多本地IP地址)

本地主机接口的第一个地址的网络掩码:

InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
更完整的方法:

InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);

for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) {
    System.out.println(address.getNetworkPrefixLength());
}

/24表示255.255.255。

FWIW,过去我曾尝试使用InterfaceAddress.getNetworkPrefixLength()和InterfaceAddress.getBroadcast(),但它们不会返回准确的信息(这是在Windows上,使用Sun JDK 1.6.0 update 10)。网络前缀长度是128(不是24,它在我的网络上),返回的广播地址是255.255.255(不是192.168.1.255,它在我的网络上)

詹姆斯

更新:我刚找到发布在此处的解决方案:

     http://forums.sun.com/thread.jspa?threadID=5277744
您需要防止Java使用IPv6,这样它就不会通过IPv6进入IPv4。
将-Djava.net.preferIPv4Stack=true添加到命令行可以修复InterfaceAddress.getNetworkPrefixLength()和InterfaceAddress.getBroadcast()的结果。

我设计了一个仅IPv4的解决方案,非常简单。我需要在这里为子网生成网络掩码,以便正确地委派这些子网。我知道我可以生成一个包含32个可能的掩码的表,但我更喜欢每次都计算它

这就是我的解决方案

/*
 * Get network mask for the IP address and network prefix specified...
 * The network mask will be returned has an IP, thus you can
 * print it out with .getHostAddress()...
 */
public static InetAddress getIPv4LocalNetMask(InetAddress ip, int netPrefix) {

    try {
        // Since this is for IPv4, it's 32 bits, so set the sign value of
        // the int to "negative"...
        int shiftby = (1<<31);
        // For the number of bits of the prefix -1 (we already set the sign bit)
        for (int i=netPrefix-1; i>0; i--) {
            // Shift the sign right... Java makes the sign bit sticky on a shift...
            // So no need to "set it back up"...
            shiftby = (shiftby >> 1);
        }
        // Transform the resulting value in xxx.xxx.xxx.xxx format, like if
        /// it was a standard address...
        String maskString = Integer.toString((shiftby >> 24) & 255) + "." + Integer.toString((shiftby >> 16) & 255) + "." + Integer.toString((shiftby >> 8) & 255) + "." + Integer.toString(shiftby & 255);
        // Return the address thus created...
        return InetAddress.getByName(maskString);
    }
        catch(Exception e){e.printStackTrace();
    }
    // Something went wrong here...
    return null;
}
/*
*获取指定的IP地址和网络前缀的网络掩码。。。
*将返回具有IP的网络掩码,因此您可以
*使用.getHostAddress()打印出来。。。
*/
公共静态InetAddress getIPv4LocalNetMask(InetAddress ip,int netPrefix){
试一试{
//因为这是针对IPv4的,所以它是32位的,所以设置的符号值为
//将整数改为“负”。。。
int shiftby=(1>1);
}
//将结果值转换为xxx.xxx.xxx.xxx格式,如
///这是一个标准地址。。。
字符串maskString=Integer.toString((shiftby>>24)和255)+“+”+Integer.toString((shiftby>>16)和255)+“+”+Integer.toString((shiftby>>8)和255)+“+Integer.toString(shiftby>>255);
//返回由此创建的地址。。。
返回InetAddress.getByName(maskString);
}
catch(异常e){e.printStackTrace();
}
//这里出了点问题。。。
返回null;
}

您只需使用IP和要使用的前缀调用它,它将为您生成网络掩码。

我刚刚完成了一个使用Java的子网网络API的工作

它具有这种功能和更多功能。

我发现:

NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
要获取ipv6的子网掩码,我们可以使用:

 networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength(); 
networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();
要获取ipv4的子网掩码,我们可以使用:

 networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength(); 
networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();

下面是一个答案,如何从WIFI连接获取子掩码:

我根据自己的需要对其进行了调整,如下所示:

private static String intToIP(int ipAddress) {
    String ret = String.format("%d.%d.%d.%d", (ipAddress & 0xff),
            (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff),
            (ipAddress >> 24 & 0xff));

    return ret;
}

public static String GetSubnetMask_WIFI() {

    WifiManager wifiManager = (WifiManager) Global.getMainActivity()
            .getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();

    DhcpInfo dhcp = wifiManager.getDhcpInfo();
    String mask = intToIP(dhcp.netmask);

    return mask;
}

您可以将获得的值转换为标准文本格式,如下所示:

short prflen=...getNetworkPrefixLength();
int shft = 0xffffffff<<(32-prflen);
int oct1 = ((byte) ((shft&0xff000000)>>24)) & 0xff;
int oct2 = ((byte) ((shft&0x00ff0000)>>16)) & 0xff;
int oct3 = ((byte) ((shft&0x0000ff00)>>8)) & 0xff;
int oct4 = ((byte) (shft&0x000000ff)) & 0xff;
String submask = oct1+"."+oct2+"."+oct3+"."+oct4;
public String mascara() throws SocketException{
try{
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
prefijo = 
""+networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
int shft = 0xffffffff<<(32- 
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength());
int oct1 = ((byte) ((shft&0xff000000)>>24)) & 0xff;
int oct2 = ((byte) ((shft&0x00ff0000)>>16)) & 0xff;
int oct3 = ((byte) ((shft&0x0000ff00)>>8)) & 0xff;
int oct4 = ((byte) (shft&0x000000ff)) & 0xff;
mascara = oct1+"."+oct2+"."+oct3+"."+oct4;
// System.out.println(""+mascara);           
}catch(UnknownHostException e){
System.out.println("Error: "+e);
}
return mascara;
}
short prflen=…getNetworkPrefixLength();
int shft=0xffffffff24))&0xff;
int oct2=((字节)((shft&0x00ff0000)>>16))&0xff;
int oct3=((字节)((shft&0x0000ff00)>>8))&0xff;
int oct4=(字节)(shft&0x000000ff))&0xff;
字符串子掩码=oct1+“+oct2+”+oct3+“+oct4;

总之,获取掩码的方法如下:

short prflen=...getNetworkPrefixLength();
int shft = 0xffffffff<<(32-prflen);
int oct1 = ((byte) ((shft&0xff000000)>>24)) & 0xff;
int oct2 = ((byte) ((shft&0x00ff0000)>>16)) & 0xff;
int oct3 = ((byte) ((shft&0x0000ff00)>>8)) & 0xff;
int oct4 = ((byte) (shft&0x000000ff)) & 0xff;
String submask = oct1+"."+oct2+"."+oct3+"."+oct4;
public String mascara() throws SocketException{
try{
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
prefijo = 
""+networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
int shft = 0xffffffff<<(32- 
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength());
int oct1 = ((byte) ((shft&0xff000000)>>24)) & 0xff;
int oct2 = ((byte) ((shft&0x00ff0000)>>16)) & 0xff;
int oct3 = ((byte) ((shft&0x0000ff00)>>8)) & 0xff;
int oct4 = ((byte) (shft&0x000000ff)) & 0xff;
mascara = oct1+"."+oct2+"."+oct3+"."+oct4;
// System.out.println(""+mascara);           
}catch(UnknownHostException e){
System.out.println("Error: "+e);
}
return mascara;
}
public String mascara()抛出SocketException{
试一试{
InetAddress localHost=Inet4Address.getLocalHost();
NetworkInterface NetworkInterface=NetworkInterface.getByInetAddress(本地主机);
前缀=
“”+networkInterface.getInterfaceAddresses().get(0.getNetworkPrefixLength();
int shft=0xffffffff24))&0xff;
int oct2=((字节)((shft&0x00ff0000)>>16))&0xff;
int oct3=((字节)((shft&0x0000ff00)>>8))&0xff;
int oct4=(字节)(shft&0x000000ff))&0xff;
睫毛膏=oct1+“+oct2+”+oct3+“+oct4;
//System.out.println(“+”睫毛膏);
}捕获(未知后异常e){
System.out.println(“错误:+e”);
}
返回睫毛膏;
}

这是安卓特有的,问题没有具体说明。Hola Israel、Aqíen sólo se permite el inglés、síhablas solo castellano a lo mejor te Interesta el你知道安卓中从以太网获取DNS和默认网关吗?