Заставить ServerSocket использовать IPv4 - PullRequest
0 голосов
/ 30 ноября 2018

Мне не удается заставить 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?

1 Ответ

0 голосов
/ 30 ноября 2018

Сокеты IPv6 также могут прослушивать входящие подключения IPv4, как видно из типа сокета tcp46.Там нет ничего плохого.IPv6 растет очень быстро, и обеспечение того, чтобы ваше программное обеспечение могло работать как с IPv4, так и с IPv6, является хорошей практикой, которая предотвратит многие проблемы в будущем (и сегодня).

Настоятельно заставлять сокет слушать только IPv4обескураженный.

...