2009-08-31 17 views
5

trato de enlazar un socket de servidor IPv6 en Java 1.6 en Windows 7, utilizando este fragmento:Enlazar un socket de servidor IPv6 en Windows

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

Por desgracia, esto no funciona con una IOException: familia de direcciones no es compatible con el protocolo family: bind

Entiendo que Java está escrito bajo el supuesto de que Windows usa pilas v4 y v6 separadas (aunque Windows 7 no) y que, por lo tanto, unir un solo socket para v4 y v6 no puede funcionar. Sin embargo, esto no es lo que estoy tratando de hacer: simplemente quiero vincular un socket v6 a la dirección (es decir: :).

Editar: También falla en Vista.

¿Qué estoy haciendo mal?

Respuesta

7

Encontré la solución; es bug 6230761. La única forma compatible para crear un canal de socket de servidor IPv6 es crear la primera ServerSocket:

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

Editar: esto significa que NIO en realidad no puede ser utilizado con IPv6.

+0

Si entiendo correctamente la "EVALUACIÓN" en el informe de error vinculado, esto ya debería estar resuelto en Java 7 b36 +. Es mi entendimiento correcto? – wilx

1

Ese error significa que está mezclando una dirección IPv6 con un protocolo que no es IPv6. Eso probablemente significa que ServerSocketChannel con el que está empezando no es compatible con IPv6. No creo que Java sea oficialmente compatible con Windows 7. Intente utilizar NetworkInterface.getNetworkInterfaces() y NetworkInterface.getInetAddresses() para asegurarse de que las direcciones IPv6 estén realmente disponibles para su aplicación Java. Los documentos de Java incluso dicen que intentar pasar una dirección IPv6 cuando IPv6 no está disponible, o cuando IPv6 se ha deshabilitado, generará excepciones.

+0

Miré getInetAddresses, y de hecho reconoce las direcciones IPv6. Entonces, ¿cómo obtengo ServerSocketChannel que admite IPv6? –

0

Estoy viendo este problema con jython también. módulo de toma de

http://bugs.jython.org/issue1711

El jython debe utilizar java.nio, porque esa es la única manera de soportar la funcionalidad de no bloqueo que requiere CPython compatibilidad.

Estoy muy decepcionado de ver que IPV6 no es compatible con el último java que se ejecuta en las últimas ventanas: esto es muy pobre. El espacio de direcciones IPV4 ya se ha agotado: va a haber mucha más demanda de soporte IPV6 en los próximos meses, y mucho menos en años.

Tenemos una solución para usuarios de jython, lo que obliga a la función getaddrinfo() a devolver direcciones IPV4 solamente. Es una solución deficiente, pero al menos pone a los usuarios en funcionamiento, si pueden obtener una dirección IPV4.

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

0

No ha sido sólo otro informe del reportero de ese fallo en el rastreador jython. Él dice que ha tenido éxito usando sockets java.nio con IPV6 en una versión anterior de JDK 1.7.

http://bugs.jython.org/issue1711

Así que mi blog sobre el soporte de IPv6 en jython no era prematura :-)

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

Hmmm, parece que mi segunda respuesta ha sido clasificado por encima de mi primera respuesta. Ver para mi primera respuesta a continuación para el contexto.

Cuestiones relacionadas