Вопрос по linux, java – Как поддерживать как IPv4, так и IPv6 на Java

15

Одна из наших Java-программ при запуске слушала только IPv6 (8080)

например

# netstat -ntpl

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::8080                 :::*                    LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      -               

Проблема в том, что он недоступен извне (кроме localhost), чтобы решить эту проблему, я должен добавить это вручную

-Djava.net.preferIPv4Stack=true

Но это делает программу только для сети IPv4.

Можно ли сделать что-то вродеsshd как указано выше, оба поддерживают IPv4 и IPv6?

Ваш Ответ

1   ответ
21

http://coding.derkeiler.com/Archive/Java/comp.lang.java.help/2009-09/msg00087.html

On some OSes, a single native TCP socket can listen to a port on both IPv4 and IPv6 simultaneously. It is able to accept connections from remote IPv4 and from remote IPv6 clients. On other OSes (such as WinXP) an OS native socket CANNOT do that, but can only accept from IPv4 or IPv6, not both. On those OSes, it is necessary to have two listen sockets in order to be able to accept connections from both remote IPv4 and IPv6 clients, one socket to listen for IPv4 connections and one for IPv6.

http://ntrg.cs.tcd.ie/undergrad/4ba2.02/ipv6/interop.html

-Djava.net.preferIPv4Stack=true

echo 0 > /proc/sys/net/ipv6/bindv6only

http://docs.oracle.com/javase/6/docs/technotes/guides/net/ipv6_guide/index.html

Nodes)      V4 Only  V4/V6  V6 Only
            -------  -----  -------
V4 Only     x        x   
V4/V6       x        x      x
V6 Only              x      x

Accept connections from both IPv6 and IPv4 clients

Похожие вопросы