【问题标题】:Java & Windows 7: Reliably getting IPv4 netmask?Java 和 Windows 7:可靠地获得 IPv4 网络掩码?
【发布时间】:2012-02-15 19:03:04
【问题描述】:

我在 Windows 上遇到了 Java 6 的一个已知错误。我的理解是,获取网络掩码的正常方法是查找网络前缀长度并进行一些位移。问题是在 Windows 上,前缀长度经常被错误地返回,所以我们得到 128 而我们应该得到 24 或 20。

this solution中,建议将-Djava.net.preferIPv4Stack=true放在Java命令行中。不幸的是,在 Windows 7 上,将其添加为 VM 参数或 Java 命令行似乎没有任何效果。

(a) 有没有人知道这个问题的任何其他变通办法,可能在 Windows 7 上仍然有效?

(b) 或者,是否有完全不同的方法来获取可靠的网络掩码?

谢谢!

附: Here is the bug report that pertains to this.

【问题讨论】:

  • 奇怪...-Djava.net.preferIPv4Stack=true VM 选项在 Windows 7 下适用于 JRE 1.6。我把它作为System.setProperty("java.net.preferIPv4Stack","true") 放在我的Java 代码中。除非,某些东西(图书馆或其他)正在重置它。你能显示你的 IP 网络掩码代码吗?
  • 感谢那行代码。我正在使用 Netbeans,并且有一个放置 VM 选项的地方。我试着把 -D 东西放在那里。不去。我还使用 Advanced Installer 创建的包装器启动应用程序,并且可以放置命令行选项。那也没有用。我将尝试您的建议,在我的主要方法顶部添加该行代码。谢谢!
  • @eee:您介意发布您的答案作为答案,以便我可以给您赏金吗?谢谢。 :)

标签: java windows-7 netmask


【解决方案1】:

-Djava.net.preferIPv4Stack=true VM 选项应该可以在任何操作系统下工作。或者,它可以作为System.setProperty("java.net.preferIPv4Stack","true"); 放入Java 代码中。除非,某些东西(库或其他)正在重置其真实状态。

【讨论】:

    【解决方案2】:

    下面的代码显示子网掩码。在具有多个网络连接的计算机(例如具有无线和 Cat-5 以太网连接的笔记本电脑)上,它可能会写入两次子网掩码,因为客户端可以有两个不同的 IP 地址。

        String os = System.getProperty("os.name");        
        try {
            if(os.indexOf("Windows 7")>=0) {
                Process process = Runtime.getRuntime().exec("ipconfig");
                process.waitFor();
                InputStream commandOut= process.getInputStream();
    
                BufferedReader in = new BufferedReader(new InputStreamReader(commandOut));
                String line;
                while((line = in.readLine()) !=null) {
                    if(line.indexOf("Subnet Mask")>=0) {
                        int colon = line.indexOf(":");
                        System.out.println(line.substring(colon+2));
                    }
                }
            }
        catch(IOException ioe) {    }
        catch(java.lang.InterruptedException utoh) {   }
    

    在有线和无线连接都处于活动状态的笔记本电脑上,我得到以下输出: 255.255.254.0 255.255.254.0

    当我关闭无线连接时,我只看到有线以太网链路的一条输出,正如预期的那样。

    【讨论】:

    • 这是一个非常好的答案,尽管上面 eee 的评论给了我便携的答案。现在我为如何处理赏金而苦恼。
    • 上面的代码是可移植的,因为您可以轻松编写代码块来处理不同的操作系统版本。如果您只需要针对 Windows 7 进行此修复,那么上面的代码就是您想要的。
    【解决方案3】:

    既然我们只是在 Windows 7 中遇到问题,为什么不寻找特定于操作系统的解决方案呢? 我知道我们可以从 Java 启动 windows 程序,包括 windows 命令行或 bat 文件。必须有一种方法可以将 ipconfig 的输出重定向到 windows 中的文本文件。您的程序应该能够通过调用 ipconfig 然后读取输出来获取子网掩码。

    【讨论】:

    • 嗯,我们在 Win7 中看到了它,但 Sun 错误并不是那么具体。无论如何,相同的解决方案应该适用于任何版本的 Windows。我必须学习如何检查操作系统类型、启动外部程序并捕获其输出。然后作为奖励,也许可以使用一些聪明的正则表达式来解析结果(而不是编写自定义代码来逐个字符地解析它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多