我尝试在Windows7上绑定Java1.6中的IPv6服务器套接字,使用以下片段:
ssock = ServerSocketChannel.open();
ServerSocket sock = ssock.socket();
sock.bind(new InetSocketAddress(InetAddress.getByAddress(new byte[16]), 0));
不幸的是,这在协议族不支持的IOException: Address系列中失败:绑定
我了解到,编写Java的前提是,Windows使用单独的v4和v6堆栈(尽管Windows 7不使用),因此为v4和v6绑定一个套接字是行不通的。但是,这不是我想要做的:我只是想将一个v6套接字绑定到任意地址(即::)。
编辑:它在Vista上也失败了。
我做错了什么?
发布于 2009-09-01 03:47:47
我找到了解决方案,那就是bug 6230761。创建IPv6服务器套接字通道的唯一受支持的方法是首先创建服务器:
ServerSocket s = new ServerSocket();
s.bind(new InetSocketAddress(InetAddress.getByName("::"), 0));
编辑:这意味着NIO不能真正与IPv6一起使用。
发布于 2009-08-31 16:21:21
该错误意味着您将IPv6地址与非IPv6 6协议混合在一起。这很可能意味着您要开始的ServerSocketChannel不支持IPv6。我认为Java还没有正式支持Windows 7。尝试使用NetworkInterface.getNetworkInterfaces()和NetworkInterface.getInetAddresses()来确保IPv6地址实际上是可用的。Java甚至说,当IPv6不可用或IPv6被禁用时,尝试传递IPv6地址将引发异常。
发布于 2011-02-28 13:19:13
我也看到了jython的这个问题。
http://bugs.jython.org/issue1711
jython模块必须使用java.nio,因为这是支持cpython兼容性所需的非阻塞功能的唯一方法。
我非常失望地看到,运行在最新窗口上的最新java不支持IPV6 :这是非常糟糕的。IPV4地址空间已经耗尽:未来几个月,对IPV6支持的需求将大大增加,更不用说几年了。
我们为jython用户提供了一个解决方案,它强制getaddrinfo()函数只返回IPV4地址。这是一个糟糕的解决办法,但至少可以让用户启动并运行,如果他们能够获得一个IPV4地址。
https://stackoverflow.com/questions/1357091
复制