web-dev-qa-db-ja.com

DNSルックアップなしで文字列をInetAddressに変換する

Stringにドット付き10進表記のローカルIPアドレスがあります。 InetAddressに変換してSocketにフィードしたいのですが、DNSルックアップを行わずに実行する必要があります(これにより、タイムアウトが長くなる可能性があるため)。

そのための準備ができたメソッドはありますか、またはStringを分割してそのバイトからInetAddressを作成する必要がありますか?

pdateファクトリメソッドInetAddress.getByName()InetAddress.getByAddress()は、どちらもJava.Sun.comなどのホスト名も受け入れるため、適切ではないようです。彼らが実装でDNSサーバーに接続しようとするかどうかは明らかではありません。

21

このようにしてください

InetAddress inetAddress = InetAddress.getByName("192.168.0.105");

リテラルIPアドレスが指定されている場合、アドレス形式の有効性のみがチェックされます。

Javaソースコード

// if Host is an IP address, we won't do further lookup    
if (Character.digit(Host.charAt(0), 16) != -1 || (Host.charAt(0) == ':')) {

}
24

GuavaのInetAddresses#forString() を使用できます。これは、具体的にユースケースに文書化されています。

指定された文字列表現を持つ InetAddress を返します。
これにより、すべてのネームサービス検索が意図的に回避されます(例:DNSなし)。

(強調を追加)

4
Matt Ball

オープンソースのIPAddress Javaライブラリ は、IPv6およびIPv4のすべての標準表現を検証し、DNSルックアップなしで検証します。免責事項:私はそのライブラリのプロジェクトマネージャーです。

次のコードは、要求していることを実行します。

        String str = "fe80:0:0:0:f06c:31b8:cd17:5a44";
        try {
            IPAddressString str = new IPAddressString(str);
            IPAddress addr = str.toAddress();//throws if invalid, without a DNS lookup
            InetAddress inetAddr = addr.toInetAddress();//convert valid address
            //use address
        } catch(AddressStringException e) {
            //e.getMessage has validation error
        }
0
Sean F

これを行うには、getByNameメソッドを使用します。例えば:

InetAddress localhost = InetAddress.getByName("127.0.0.1")

Java docsで説明されているように:

ホスト名は、「Java.Sun.com」などのマシン名か、IPアドレスのテキスト表現のいずれかです。リテラルIPアドレスが指定されている場合、アドレス形式の有効性のみがチェックされます。

0
Ali