在Windows上绑定IPv6服务器套接字

时间:2009-08-31 11:51:46

标签: java windows windows-7 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而失败:协议族不支持的地址族:bind

我理解Java的编写假设Windows使用单独的v4和v6堆栈(即使Windows 7没有),因此绑定v4和v6的单个套接字也无法工作。但是,这不是我想要做的:我只想将v6套接字绑定到任何地址(即::)。

修改:Vista上也失败了。

我做错了什么?

4 个答案:

答案 0 :(得分:7)

我找到了解决方案;它是bug 6230761。创建IPv6服务器套接字通道的唯一受支持的方法是首先创建serversocket:

ServerSocket s = new ServerSocket();
s.bind(new InetSocketAddress(InetAddress.getByName("::"), 0));

编辑:这意味着NIO无法真正用于IPv6。

答案 1 :(得分:1)

该错误意味着您正在将IPv6地址与非IPv6协议混合使用。这可能意味着您开始使用的ServerSocketChannel不支持IPv6。我认为Java还没有正式支持Windows 7。尝试使用NetworkInterface.getNetworkInterfaces()和NetworkInterface.getInetAddresses()来确保您的Java应用程序实际可以使用IPv6地址。 Java文档甚至说,当IPv6不可用或IPv6被禁用时尝试传递IPv6地址会引发异常。

答案 2 :(得分:0)

我也看到了jython的这个问题。

http://bugs.jython.org/issue1711

jython套接字模块必须使用java.nio,因为这是支持cpython兼容性所需的非阻塞功能的唯一方法。

我非常失望地看到最新Windows上运行的最新java不支持IPV6:这非常糟糕。 IPV4地址空间已经耗尽:未来几个月对IPV6支持的需求将会更多,更不用说几年了。

我们为jython用户提供了一种解决方法,它强制getaddrinfo()函数仅返回IPV4地址。这是一个糟糕的解决方法,但至少它可以让用户启动并运行,如果他们可以获得IPV4地址。

http://wiki.python.org/jython/NewSocketModule#IPV6_address_support

答案 3 :(得分:0)

jython跟踪器上的那个bug的记者刚刚发布了另一份报告。他说他在早期版本的JDK 1.7上使用带有IPV6的java.nio套接字取得了成功。

http://bugs.jython.org/issue1711

所以我在jython上关于IPV6支持的博客文章并不成熟: - )

http://jython.xhaus.com/jython-supports-ipv6/

嗯,看来我的第二个答案已列在我的第一个答案之上。请参阅下面的第一个答案。