5

我尝试使用以下片段在 Windows 7 上的 Java 1.6 中绑定 IPv6 服务器套接字:

ssock = ServerSocketChannel.open();
ServerSocket sock = ssock.socket(); 
sock.bind(new InetSocketAddress(InetAddress.getByAddress(new byte[16]), 0));

不幸的是,这失败了 IOException: Address family not supported by protocol family: bind

我知道编写 Java 时假设 Windows 使用单独的 v4 和 v6 堆栈(即使 Windows 7 没有),因此为 v4 和 v6 绑定单个套接字是行不通的。但是,这不是我想要做的:我只想将 v6 套接字绑定到任意地址(即 ::)。

编辑:它在 Vista 上也失败了。

我究竟做错了什么?

4

4 回答 4

7

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

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

编辑:这意味着 NIO 不能真正与 IPv6 一起使用。

于 2009-09-01T11:47:47.667 回答
1

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

于 2009-09-01T00:21:21.733 回答
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

于 2011-02-28T21:19:13.090 回答
0

记者刚刚又报告了 jython 跟踪器上的那个错误。他说他在 JDK 1.7 的早期版本中成功使用了带有 IPV6 的 java.nio 套接字。

http://bugs.jython.org/issue1711

所以我关于 jython 的 IPV6 支持的博文并不为时过早 :-)

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

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

于 2011-02-28T21:32:07.130 回答