有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java强制ServerSocket使用IPv4

我无法让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堆栈


共 (1) 个答案

  1. # 1 楼答案

    IPv6套接字还可以侦听传入的IPv4连接,从tcp46套接字类型可以看到这一点。这没什么错。IPv6的发展速度非常快,确保您的软件可以同时使用IPv4和IPv6是一种很好的做法,可以防止将来(以及今天)出现许多问题

    强烈反对强制套接字只侦听IPv4