Как поддерживать как IPv4, так и IPv6 на Java

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

например

<code># 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      -               
</code>

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

<code>-Djava.net.preferIPv4Stack=true
</code>

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

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

Ответы на вопрос(1)

Решение Вопроса

что это меньше проблема программирования на Java, чем проблема сетевого стека ОС / конфигурации сети ОС:

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

В некоторых операционных системах один собственный сокет TCP может одновременно прослушивать порты как IPv4, так и IPv6. Он может принимать соединения от удаленного IPv4 и от удаленных клиентов IPv6. В других ОС (таких как WinXP) собственный сокет ОС НЕ МОЖЕТ делать этого, но может принимать только от IPv4 или IPv6, но не от обоих. В этих операционных системах необходимо иметь два сокета прослушивания, чтобы можно было принимать соединения как от удаленных клиентов IPv4, так и IPv6, один сокет для прослушивания соединений IPv4 и один для IPv6.

Windows 7 и Windows Server 2008 отлично справляются с двумя стеками; Windows XP не так много:)

Похоже, вы работаете в Linux - большинство современных настольных компьютеров и серверов Linux также без проблем справляются с двумя ipv4 ipv6.

Вот хорошая статья о совместимости:

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

Вы знаете, как можно «отключить» IPV6 для своего Java-приложения:-Djava.net.preferIPv4Stack=true

Вы также можете заставить свой сервер использовать IPV6 следующим образом:echo 0 > /proc/sys/net/ipv6/bindv6only

Возможно, это ваш лучший источник:

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

Вы обязательно должны быть в состоянии выполнить то, что вы хотите (по крайней мере, на уровне программирования Java), если вы не ограничены внешними сетевыми проблемами:

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

PS:

Вот еще одна хорошая ссылка, которая объясняет, что происходит на уровне сокетов. Это не Java (это C), но применимы именно примеры:

Принимать подключения от клиентов IPv6 и IPv4

Ваш ответ на вопрос