Java の IPV6_V6ONLY サポート
新城@筑波大学です。こんにちは。
Java で IPv6 専用のサーバを書こうすると、かなり面倒だというこ
とがわかりました。普通に IPv6 any (::) で bind すると、IPv4
への要求も受け付けてしまいます。
C 言語、というか、普通の Socket API なら、こんな感じで、IPv6
専用にできます。
s = socket( PF_INET6, SOCK_STREAM, 0 );
on = 1;
setsockopt( s,IPPROTO_IPV6, IPV6_V6ONLY,&on,sizeof(on) );
Java のドキュメントを見ると、将来サポートするというのが出てきました。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/net/ipv6_guide/index.html#special
http://docs.oracle.com/javase/1.5.0/docs/guide/net/ipv6_guide/index.html#special
------------------------------------------------------------
特殊な IPv6 アドレス型
未指定アドレス (:: IPv4 の 0.0.0.0 に対応)
...
:: にバインドされているとき、メソッド ServerSocket.accept は、
IPv6 ホストと IPv4 ホストの両方からの接続を受け入れます。現在
の Java プラットフォーム API では、IPv6 ホストからの接続だけ
を受け入れるように指定する方法はありません。
...
注: このあと説明するオプションは、
Draft-ietf-ipngwg-rfc2553bis-03.txt で導入されています。それ
が標準規格になった時点で、そのオプションが Java 2 プラット
フォームでサポートされる予定です。
...
プリケーションによっては、AF_INET6 ソケットの使用を IPv6 通信
だけに限定したい場合があります。そのようなアプリケーションで
は、IPV6_V6ONLY ソケットオプションを定義します。このオプショ
ンをオンに設定すると、IPv6 パケットだけを送受信するためにその
ソケットを使用できます。デフォルトでは、このオプションはオフ
になっています。
------------------------------------------------------------
この Java での IPV6_V6ONLY のサポートは、どういう状況になって
いるんでしょうかね。
上のドキュメントには、
java.net.NetworkInterface.getNetworkInterfaces() して、
ifconfig -a 相当のことをしながら、自分が使えるIP アドレスを探
してなんとかしろ、みたいなことは書いてあります。でも、any
(::) で書きたいですよね。::1 の要求もあるし。それに、IPv6 の
ドレスを列挙できても、プライバシ対策の temporary なものまで全
部見つかるので、どれが普通に使えるものなのか分かりません。
困ったなあ。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 情報工学 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735