河野真治 @ 琉球大学情報工学です。

Java のServerなんですが、

なんか、IPv6 では接続できないし。なんでだろう? Any でbindす
るのだと、tcp4 にしかbindしないっぽい。変だなぁ。

ssc.socket().bind(new InetSocketAddress(receive_port)); 

で良いはず。なんですが、dual stack/single stackでも状況が異なる
らしい。netstat で見る限り、tcp4 になってしまう。


v6なワイルドカードアドレスを明示的に取る手法が良くわからない。 と思っていたら、

http://tinyurl.com/57jehf 

には、"::" を使えみたいなことが書いてあるな。 

         ssc.socket().bind(new InetSocketAddress("::",receive_port)); 

とするみたいですね。なるほど〜 

    tcp46 0 0 *.8766 *.* LISTEN

と、めでたく接続。telnet ::1 8766 で問題なく接続。めでたしめでたし。

と思っていたら、

http://d.hatena.ne.jp/torutk/20080127/p1 

■[Java]NIOパッケージのServerSocketChannelはWindows上ではIPv6をlistenしない 
Windows OSでNIOパッケージを使ってTCPサーバを記述したときにIPv6が使えないという問題にあたりました。BugIDにも登録されてますが、解決のめどはないようです。
Bug ID: 6230761 (so) NIO channels with IPv6 on Windows 

なので、Windows Vista では、この方法ではダメらしいです。ふ〜ん。
なので、なんかの回避コードが必要っぽい。

java7 では、直るみたいな話もbugID の方には出ているみたいです。

---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科