如何支持IPv4和& Java上的IPv6

时间:2012-04-30 04:22:32

标签: java linux networking network-programming ipv6

我们的一个Java程序启动时,它只监听IPv6(8080)

e.g。

# 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 个答案:

答案 0 :(得分:21)

我怀疑它不像操作系统网络堆栈/操作系统网络配置问题那样是Java编程问题:

  

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

     

在某些操作系统上,单个本机TCP套接字可以侦听两者上的端口       IPv4和IPv6同时进行。它能够接受来自的连接       远程IPv4和远程IPv6客户端。在其他操作系统(如WinXP)上       操作系统原生套接字不能这样做,但只能接受来自IPv4或       IPv6,而不是两者。在这些操作系统上,有两个必须听       套接字,以便能够接受来自远程IPv4的连接       和IPv6客户端,一个用于侦听IPv4连接的套接字和一个用于侦听IPv4连接       的IPv6。

Windows 7和Windows Server 2008处理双栈很好; Windows XP并非如此:)

你似乎在Linux上 - 大多数现代Linux桌面和服务器也可以处理双ipv4 ipv6而没有任何问题。

这是一篇关于互操作性的好文章:

您知道如何为您的Java应用程序“关闭”IPV6:-Djava.net.preferIPv4Stack=true

您还可以强制您的服务器使用IPV6,如下所示:echo 0 > /proc/sys/net/ipv6/bindv6only

这可以说是你最好的来源:

除非受到外部网络问题的限制,否则你绝对应该能够完成你想要的任务(至少在Java编程层面):

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

PS:

这是一个更好的链接,它解释了套接字级别发生的事情。它不是Java(它是C),但完全适用于样本原则: