java.net.Inet6Address
オーバーライドしないgetByName()
ため、パラメーター自体が有効な IPv6 アドレスの形式でない限り、常に特定の IPv4 アドレスを返します。この場合、このメソッドは Inet6Address オブジェクトを返します。
例:
getByName("stackoverflow.com")
--> Inet4Address
getByName("2001:0db8:85a3:08d3:1319:8a2e:0370:7344")
--> Inet6Address
InetAddress.getByName()-ドキュメント
ホストの名前を指定して、ホストの IP アドレスを決定します。ホスト名は、「java.sun.com」などのマシン名か、その IP アドレスのテキスト表現のいずれかです。リテラル IP アドレスが指定されている場合は、アドレス形式の有効性のみがチェックされます。
> リテラル IPv6 アドレスで指定されたホストの場合、RFC 2732 で定義された形式または RFC 2373 で定義されたリテラル IPv6 アドレス形式のいずれかが受け入れられます。<
したがって、IPv6 アドレスを取得する場合は、パラメーター内で定義するか、IPv4 アドレスではなく IPv6 アドレスを返すように DNS サーバーを構成する必要があります。
IPv6 アドレスを取得する別の方法InetAddress.getAllByName("www.google.at")
は、ホストのすべての既知の IP アドレスを返す を使用することです。
たとえば、このメソッドを使用して、返された配列をフィルタリングし、最初の IPv6-Address を返すnull
か、ホストに IPv6 アドレスがない場合:
public Inet6Address getIPv6Addresses(InetAddress[] addresses) {
for (InetAddress addr : addresses) {
if (addr instanceof Inet6Address) {
return (Inet6Address) addr;
}
}
return null;
}
更新:
その他の機能、特に DNS サーバーに影響を与える機能については、外部ライブラリ DNSJava を使用することをお勧めします。これは、DNS サポートのプレーンな Java 実装が貧弱であるためです。
http://www.dnsjava.org/
現在のコード:
public class Ping
{
public void pingHost (String hostName)
{
try
{
InetAddress[] inet = InetAddress.getAllByName(hostName);
String address = this.getIPv4Addresses(inet).getHostAddress();
boolean status = this.getIPv6Addresses(inet).isReachable(5000);
if (status)
{
System.out.println(reverseDns(address) + " Host Reached\t" + this.getIPv6Addresses(inet).getHostAddress());
}
else
{
System.out.println(this.getIPv6Addresses(inet).getCanonicalHostName() + " Host Unreachable");
}
}
catch (UnknownHostException e)
{
System.err.println("Host does not exists");
}
catch (IOException e)
{
System.err.println("Error in reaching the Host");
}
}
public Inet6Address getIPv6Addresses(InetAddress[] addresses)
{
for (InetAddress addr : addresses)
{
if (addr instanceof Inet6Address)
{
return (Inet6Address) addr;
}
}
return null;
}
public Inet4Address getIPv4Addresses(InetAddress[] addresses)
{
for (InetAddress addr : addresses)
{
if (addr instanceof Inet4Address)
{
return (Inet4Address) addr;
}
}
return null;
}
public static String reverseDns(String hostIp) throws IOException
{
Resolver res = new ExtendedResolver();
Name name = ReverseMap.fromAddress(hostIp);
int type = Type.PTR;
int dclass = DClass.IN;
Record rec = Record.newRecord(name, type, dclass);
Message query = Message.newQuery(rec);
Message response = res.send(query);
Record[] answers = response.getSectionArray(Section.ANSWER);
if (answers.length == 0)
return hostIp;
else
return answers[0].rdataToString();
}
}