Windows上でのIPv6サーバソケットをバインド
質問
私はこのフラグメントを使用して、Windows 7上でのJava 1.6でのIPv6サーバーソケットをバインドしようとします:
ssock = ServerSocketChannel.open();
ServerSocket sock = ssock.socket();
sock.bind(new InetSocketAddress(InetAddress.getByAddress(new byte[16]), 0));
残念ながら、これはIOExceptionを表示して失敗:プロトコルファミリでサポートされていないアドレスファミリ:バインド
私は、JavaがWindowsが(Windows 7はないにもかかわらず)別のV4とV6のスタックを使用していることを前提に書かれていることを理解し、そしてそれゆえ、両方のV4とV6が動作しないことができるため、単一のソケットをバインド。しかし、これは私がしようとしてるものではありません:私は単にのいずれかののアドレスにV6ソケットをバインドする(すなわち::)
編集:また、Vista上で失敗した。
。私が間違って何をしているのですか?
解決
私は解決策を見つけました。それはバグ6230761 のです。 IPv6のサーバソケットチャネルを作成するための唯一の方法は、最初のServerSocketを作成することです。
ServerSocket s = new ServerSocket();
s.bind(new InetSocketAddress(InetAddress.getByName("::"), 0));
編集:これはNIOが実際にIPv6で使用することができないことを意味します。
。他のヒント
これエラーは、非IPv6プロトコルとIPv6アドレスとを混合していることを意味します。それはおそらくあなたが始めているのServerSocketChannelがIPv6をサポートしていないことを意味します。私は、Javaはまだ正式にWindows 7をサポートしていないと思います。 IPv6アドレスは、実際にあなたのJavaアプリが利用できることを確認するNetworkInterface.getNetworkInterfaces()とNetworkInterface.getInetAddresses()を使用してみてください。 JavaのドキュメントでもIPv6が利用できない場合、またはIPv6が無効になっているとき、例外が発生する時期IPv6アドレスを渡そうと言っています。
私は同様のJythonでこの問題を見ている。
http://bugs.jython.org/issue1711する
それは互換性が必要とCPythonの非ブロック機能をサポートする唯一の方法であるため、Jythonのソケットモジュールは、java.nioの使用する必要があります。
私はIPV6は、最新のWindows上で実行されている最新のJavaでサポートされていないことを確認することが非常に失望している:これは非常に悪いです。 IPv4アドレス空間がすでに排出される:今後数カ月でのIPv6サポートのためのより多くの需要があるように起こっている、一人で年間ましょう。
。私たちは、IPv4アドレスのみを返すためにはgetaddrinfo()関数を強制的にJythonのユーザーのための回避策を、持っています。それは、貧しい人々の回避策だが、彼らは、IPv4アドレスを取得することができれば、少なくともそれは、稼働してユーザーを取得します。
http://wiki.python.org/jython/NewSocketModule#IPV6_address_supportする
ちょうどJythonのトラッカーにそのバグの報告者から別のレポートが行われています。彼はJDK 1.7の早期リリースにIPV6とjava.nioのソケットを使用して成功を収めていたことを述べています。
http://bugs.jython.org/issue1711する
だから、Jythonの上IPV6のサポートについての私のブログの記事は時期尚早ではなかった: - )
http://jython.xhaus.com/jython-supports-ipv6/
うーん、私の第二の答えは私の最初の答えの上に記載されていることが表示されます。コンテキストの下の私の最初の答えを参照してください。