0

Java を介して IP アドレスを取得することに飛び込み始めています。マシンがさまざまなネットワーク インターフェイスを介してさまざまな IP を持つ可能性があることを理解しているため、「優先」IP アドレス (Windows 7 コマンド ライン ipconfig /all ごとに優先) を返すように見えるサンプル コードについて、多少混乱しています。

ローカル コンピューターで次のコードを実行すると、26 個の NetworkInterface オブジェクトが返され、その中には複数の InetAddress オブジェクト (「優先」オブジェクトを含む) が含まれているものもあります。

Enumeration<NetworkInterface> eNI = null;
    NetworkInterface ni = null;

    Enumeration<InetAddress> eIA = null;
    InetAddress ia = null;

    try {
        eNI = NetworkInterface.getNetworkInterfaces();
    } catch (Exception e) {
    }

    while (eNI.hasMoreElements()) {

        ni = eNI.nextElement();
        System.out.println("NtwkIntfc name: " + ni.getName());
        System.out.println("NtwkIntfc disp name: " + ni.getDisplayName());

        try {
            System.out.println("NtwkIntfc hardware addr: " + Hex.encodeHexString(ni.getHardwareAddress()));
        } catch (Exception e) {
        }

        eIA = ni.getInetAddresses();

        while (eIA.hasMoreElements()) {

            ia = eIA.nextElement();

            System.out.println("InetAddress host address: " + ia.getHostAddress());
            System.out.println("InetAddress host name: " + ia.getHostName());

        }
    }

ただし、このはるかに単純なコードは単に「優先」IPv4 アドレスを返します。

try {
        InetAddress thisIp = InetAddress.getLocalHost();  
        System.out.println("IP:" + thisIp.getHostAddress());
    } catch (Exception e) {
        e.printStackTrace();
    }

「優先」として識別するNetworkInterface(およびそれからのInetAddress)プロパティ/メソッドが見つからないように見えるので、クラスメソッドInetAddress.getLocalHost()がどのようにそれを行うのか疑問に思っていますか?さらに、この優先 IP は標準的なネットワークの概念ですか、それとも何らかの Windows 固有の概念ですか?

ありがとう。

4

4 に答える 4

1

InetAddress.getLocalHost()のソース コードを確認してください。

簡単に言えば、ホスト名にバインドされた IP アドレスを取得し、返された IP アドレスの配列から最初のエントリを返します。

マシンのホスト名にマップされたアドレス以外は、これが優先されることに固有のものはありません(ただし、マシンは複数の名前を持つこともできます)

于 2013-02-11T17:33:55.167 に答える
0

他の解決策は、ソケットで動作するように継ぎ目があります (最適なものではありません)。

Socket socket = new Socket("www.somesite.com", 80); 
InetAddress localhost = socket.getLocalAddress(); 
System.out.println("Address of local host is " + localhost);
socket.close(); 
于 2013-02-11T17:44:56.210 に答える
0

「優先」は、ルーティング テーブルの最も一般的なエントリを何らかの形で参照していると思います。それらの Windows 狂人が何を考えていたかは誰にもわかりません。

ただし、このアドレスは、DHCP によって割り当てられたパブリック IP である可能性が最も高いアドレスにも対応している可能性があります。最も可能性の高いアドレスをパブリックにする/ポートを開くために使用するコードを探している場合、これは私がIPv4アドレスを取得するために使用するものです:

public static InetAddress getNetworkAddr() {
    InetAddress localAddr = null;

    // Find our public IP address
    Enumeration<NetworkInterface> netInterfaces;
    try {
        netInterfaces = NetworkInterface.getNetworkInterfaces();
        while (netInterfaces.hasMoreElements()) {               
            NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();               
            Enumeration<InetAddress> addresses = ni.getInetAddresses();             
            while( addresses.hasMoreElements() ) {
                InetAddress addr = addresses.nextElement();

                // System.out.println("Checking out " + ni.getName() + " with address " + addr.toString());

                if (!addr.isSiteLocalAddress() && 
                        !addr.isLoopbackAddress() && 
                        !addr.isLinkLocalAddress() &&
                        addr.getHostAddress().indexOf(":") == -1) { // MAC/IPv6 address detection
                    System.out.println("Interface " + ni.getName()
                            + " seems to be InternetInterface. I'll take address " + addr.toString());
                    System.out.println("Associated hostname: " + addr.getHostName());
                    localAddr = addr;
                    break;
                }
            }   
            if( localAddr != null ) break;
        }
    } catch( NoSuchElementException e) {
        System.out.println("Couldn't find a public address");
        localAddr = null;
    } catch (SocketException e) {
        e.printStackTrace();
        localAddr = null;
    }

    return localAddr;
}
于 2013-02-11T17:34:20.007 に答える