Управление поведением сокетов IPv4/IPv6 в Java NIO (аналогично флагу IPV6_ONLY в BSD)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Управление поведением сокетов IPv4/IPv6 в Java NIO (аналогично флагу IPV6_ONLY в BSD)

Сообщение Anonymous »

Я работаю над кроссплатформенным проектом с использованием каналов Java NIO и пытаюсь воспроизвести поведение флага IPV6_ONLY (аналогично тому, что доступно в BSD), чтобы контролировать поведение сокетов IPv4 и IPv6 при привязке к один и тот же порт.
Цель состоит в том, чтобы иметь два варианта:
  • Отдельные сокеты для IPv4 и IPv6 — я хочу контролировать могу ли я открыть отдельные сокеты для IPv4 и IPv6 (например, один DatagramChannel для IPv4 и другой для IPv6, каждый из которых привязан к одному и тому же порту).
  • Двухрежимный сокет IPv6 — я хочу использовать один сокет IPv6, который может принимать пакеты как IPv4, так и IPv6, имитируя поведение флага IPV6_ONLY в BSD, который ограничивает прием только сокета IPv6. Пакеты IPv6.
Вот упрощенная версия кода, который я использую:

Код: Выделить всё

// Opening IPv4 DatagramChannel
DatagramChannel ipv4Channel = DatagramChannel.open(StandardProtocolFamily.INET);
ipv4Channel.bind(new InetSocketAddress(port));

// Opening IPv6 DatagramChannel
DatagramChannel ipv6Channel = DatagramChannel.open(StandardProtocolFamily.INET6);
ipv6Channel.bind(new InetSocketAddress(port));
Проблема, с которой я столкнулся, заключается в том, что, хотя DatagramChannel позволяет открывать отдельные каналы для IPv4 и IPv6, существует ограничение, при котором вы не можете открыть второй сокет с другим семейством IP (IPv4 или IPv6). ) на том же порту. Это происходит, если один сокет уже открыт для определенного семейства IP (IPv4 или IPv6). Я получаю сообщение об ошибке «порт уже используется» при попытке привязать второй сокет с другим семейством IP к тому же порту.
Мне нужна возможность:
  • Откройте отдельные сокеты для IPv4 и IPv6 на одном и том же порту (как для DatagramChannel, так и, возможно, для ServerSocketChannel или SocketChannel).
  • Настройте сокет IPv6 для принять оба пакеты IPv4 и IPv6 (например, флаг BSD IPV6_ONLY) и переключать его поведение между приемом только пакетов IPv6 или двойным режимом (IPv4/IPv6).
Есть в Java NIO есть способ:
  • Открыть отдельные сокеты IPv4 и IPv6 на одном и том же порту (не обнаруживая «порт, уже используемый» ошибка)?
  • Настроить сокет IPv6 для приема пакетов IPv4 и IPv6 или реализовать поведение, аналогичное флагу BSD IPV6_ONLY?
Поскольку я пишу кроссплатформенный код, я ищу решение, которое будет работать в разных операционных системах, обеспечивая при этом одинаковый уровень контроля над поведением сокетов.
Некоторые другие разговоры из прошлого на те же темы от я:
  • Настройка каналов Java NIO для IPv4 и IPv6 отдельно
  • Канал Java NIO DatagramChannel: невозможно открыть несколько сокетов на Один и тот же порт с IPv4 и IPv6


Подробнее здесь: https://stackoverflow.com/questions/792 ... ly-flag-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»