Это на Java, но при необходимости я всегда могу вернуться на C через JNI.Как использовать многоадресную рассылку в многопользовательской системе (Java, Linux)
У меня есть система с двумя сетевыми адаптерами, каждая из которых подключена к отдельной подсети. Я хочу использовать многоадресную рассылку (в частности, SDP) для обнаружения других хостов в обеих сетях.
Одна сеть проста: создайте MulticastSocket на указанном порту, joinGroup его, и я получаю пакеты. Простота.
Две сети: пока что невозможно. Я пробовал:
1) создание двух сокетов, привязанных к одному и тому же порту, и использование setInterface() или setNetworkInterface() для «соединения» с правым интерфейсом. Не повезло, даже после различных перестановок setReuseAddress().
2) создать единый сокет, а затем попытаться присоединиться дважды, с двумя вызовами joinGroup (SocketAddress mcastaddr, NetworkInterface netIf). Второй вызов соединения не выполняется.
Решения за пределами Java были бы замечательными. В частности, если бы я мог настроить многоадресные маршруты, которые бы эффективно «объединили» два интерфейса (я мог бы затем посмотреть на каждый пакет, чтобы определить, какая сеть), что было бы хорошо. Как я уже упоминал ранее, в этой среде можно использовать любое количество нативного кода (Linux, с инфраструктурой java Apache «luni»).
Спасибо!
Когда вы присоединяетесь к группе многоадресной передачи, вы присоединяетесь к адресу, а не к порту. Пакеты многоадресной передачи будут перенаправлены в вашу сетевую карту на порту, указанном в пакете, отправленном, поэтому, если вы не связывались на том же порту, вы его не получите. Таким образом, вы должны * привязываться к этому порту, чтобы получать многоадресные пакеты. Я пробовал это уже ... – Matthieu