Многоадресная отправка UDP на неправильный сетевой адаптер (Java, Mac OS X) - PullRequest
2 голосов
/ 21 декабря 2011

Во время работы над приложением Java под Mac OS X (Lion, 10.7.2, Java версия "1.6.0_29") я столкнулся со странной проблемой при попытке отправить многоадресные дейтаграммы UDP. Пакеты отправляются только на один сетевой адаптер, и я не могу контролировать, какой из них.

Следующий пример кода иллюстрирует то, что я пытаюсь сделать:

public class MCast {
    public static void main(String[] args) throws IOException {
        InetAddress multicastAddr = InetAddress.getByName("224.0.0.1");
        int port = 58680;
        byte[] data = "test".getBytes();

        DatagramPacket packet = new DatagramPacket(data, data.length, multicastAddr, port);

        MulticastSocket socket = new MulticastSocket();
        socket.joinGroup(multicastAddr);
        socket.setNetworkInterface(NetworkInterface.getByName("en0"));

        socket.send(packet);
        System.out.println("Packet sent.");
    }
}

При выполнении этого кода я использую Wireshark для проверки всего трафика, выходящего на en0. На указанный порт пакеты не отправляются. Однако указанные пакеты появляются на трассе для en1.

Когда я отключаю en1, пакеты выходят на en0 правильно.

Я в растерянности. Кто-нибудь знает, что происходит?

Ответы [ 2 ]

6 голосов
/ 21 декабря 2011

Интерфейс многоадресного вывода определяется текущей таблицей маршрутизации во время присоединения к группе. В большинстве случаев это означает маршрут по умолчанию, следовательно, en0. Добавление явного маршрута поможет, но вы можете просто поменять две строки в вашем коде так:

socket.setNetworkInterface(NetworkInterface.getByName("en0"));
socket.joinGroup(multicastAddr);

Кроме того, вам не нужно присоединяться (или bind()) к группе, если вы только отправляете, а не прослушиваете этот многоадресный трафик. Вместо этого connect() на групповой адрес.

0 голосов
/ 21 декабря 2011

Вы можете передать адрес конструктору MulticastSocket. Вы можете использовать его для привязки к нужному адресу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...