2009-08-31 20 views
5

IPv6服務器套接字我嘗試在Windows 7中的Java 1.6 IPv6服務器套接字綁定,使用此片段:綁定在Windows

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

不幸的是,這種失敗,並拋出IOException:地址家族不受協議支持家族:綁定

據我所知,Java的編寫假定Windows使用單獨的v4和v6堆棧(即使Windows 7沒有),因此爲v4和v6綁定單個套接字無法工作。然而,這不是我試圖做的:我只是想綁定V6插座的任何地址(即::)。

編輯:它也不能在Vista上。

我在做什麼錯?

回答

7

我發現該溶液;它是bug 6230761。創建IPv6服務器套接字通道僅支持方式是先創建的ServerSocket:

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

編輯:這意味着NIO無法真正使用IPv6使用。

+0

如果我正確理解鏈接的錯誤報告中的「評估」,則應該已經在Java 7 b36 +中修復了這個問題。我的理解是否正確? – wilx

1

即錯誤意味着您正在使用非IPv6協議混合的IPv6地址。這可能意味着您開始使用的ServerSocketChannel不支持IPv6。我不認爲Java官方支持Windows 7。嘗試使用NetworkInterface.getNetworkInterfaces()和NetworkInterface.getInetAddresses()來確保IPv6地址實際上可用於您的Java應用程序。 Java文檔甚至表示,當IPv6不可用時或IPv6已被禁用時嘗試傳遞IPv6地址會引發異常。

+0

我看着getInetAddresses,它確實可以識別IPv6地址。那麼如何獲得支持IPv6的ServerSocketChannel? –

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

0

還有的剛剛從Jython的跟蹤器的bug記者另一份報告。他說,在JDK 1.7的早期版本中,他已經成功地使用了帶有IPV6的java.nio套接字。

http://bugs.jython.org/issue1711

所以我的關於Jython的IPV6支持的博客文章是不是過早:-)

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

嗯,看來我的第二個答案已被列入我上面的第一個答案。關於上下文,請參閱下面的第一個答案。