ナチュラル @rch850

ナチュラル丼発祥の地、福井からお届けします。技術的な話題とか、雑談とか。

Windows Vista 以降での WiiFlash 接続エラー

WiiFlashJava からつなぐと下記の例外が出る現象に悩まされてきました。

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);
}

んー、見たまんまですね。どういう理由か分かりませんが、こうなってました。とりあえず、クライアント側のコードの変更だけで対応できたので安心しました。