Мне не удается заставить 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-адресом, даже если я указал «0.0.0.0» IPv4-адрес при создании ServerSocket.
С другой стороны, если я укажу-Djava.net.preferIPv4Stack=true
в опции vm я получу следующий сценарий.
➜ ~ 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)
Теперь вы можете заметить, что теперь я правильно слушаю порт 11000 по IPv4-адресу, что мне и нужно, но я могу толькочтобы достичь этого решения, отправив конкретную опцию vm.
Как я могу надежно решить, какую версию стека IP я могу прослушивать при открытии ServerSocket
?