【发布时间】:2019-05-02 18:05:57
【问题描述】:
我无法让ServerSocket 使用 IPv4 而不是 IPv6,这似乎是我系统上的默认行为。
跑步
new ServerSocket(11000, queueLimit, InetAddress.getByName("0.0.0.0")
会导致
➜ ~ netstat -an | grep 11000
tcp46 0 0 *.11000 *.* LISTEN
➜ ~ lsof -i :11000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2845 myuser 383u IPv6 0x5ba3bfaea6c7372d 0t0 TCP *:irisa (LISTEN)
如您所见,我们监听端口 11000 的地址是 IPv6 地址,即使我在创建 ServerSocket 时指定了“0.0.0.0” IPv4 地址。
另一方面,如果我在 vm 选项上指定-Djava.net.preferIPv4Stack=true,我会得到以下场景。
➜ ~ netstat -an | grep 11000
tcp4 0 0 *.11000 *.* LISTEN
➜ ~ lsof -i :11000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 3628 myuser 384u IPv4 0x5ba3bfaeaafaa08d 0t0 TCP *:irisa (LISTEN)
您现在可以注意到,我现在可以正确侦听 IPv4 地址上的端口 11000,这正是我想要的,但我只能通过发送特定的 vm 选项来达到此解决方案。
在打开ServerSocket 时,我如何可靠地决定我可以收听哪个版本的 IP 堆栈?
【问题讨论】:
标签: java ipv6 serversocket ipv4 netstat