Windows Vista 以降での WiiFlash 接続エラー
WiiFlash に Java からつなぐと下記の例外が出る現象に悩まされてきました。
java.net.ConnectException: Connection refused: connect
が、それがさっきようやく解決しました!結論を言うと、IPv6 でつなげば OK です。解決の経緯は以下の通り。
何をしたらいいかさっぱり分からず、WiiFlash サーバを動かして、telnet localhost 19028 を垂れ流してました。そこで、ふと思い立って netstat コマンドを打ってみたら、http 接続にまぎれてこんな出力が。
TCP [::1]:19028 [::1]:53233 ESTABLISHED TCP [::1]:53233 [::1]:19028 ESTABLISHED
アドレス表記が IPv6 だ!これはもしかして……と思って、Java のほうで "localhost" やら "127.0.0.1" ではなく "[::1]" に接続したら、うまくいきました。
どうやら、サーバが IPv6 のみリッスンしてそうだ、ということで、サーバのソースを見てみました。前は Mac 版サーバのみソースが添付されていたと思うのですが、いつからか Windows 版もソースが付いてくるようになりました。
ソースコードの zip を展開し、それっぽいソースファイル Window1.xaml.cs を開いてみたら、321 行目から始まる initSocket メソッドがこのようになっていました。
if ( version >= 6 ) { // start the socket server using IPV6 (Windows Vista or Windows 7) mySocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); mySocket.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, 0); } else { // start the socket server normally mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); }
んー、見たまんまですね。どういう理由か分かりませんが、こうなってました。とりあえず、クライアント側のコードの変更だけで対応できたので安心しました。