通过交叉连接进行UDP广播

时间:2017-02-07 20:33:58

标签: java sockets networking network-programming udp

我正在尝试在所有NetworkInterfaces上广播UDP数据包并收到回复。虽然我能够从本地网络接收响应,但是通过交叉连接连接的设备无法接收回复。

这是获取所有接口的代码,它确实返回交叉连接的NetworkInterface

    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        while(interfaces.hasMoreElements()){
            List<InterfaceAddress> iAddrs = interfaces.nextElement().getInterfaceAddresses();
            iAddrs.forEach(addr -> {
                if(addr.getBroadcast() != null){
                    System.out.println(addr.getBroadcast());

                    sendUDP(addr.getBroadcast());
                }
            });
        }

然后我使用这部分代码发送UDP数据包并监听响应。

    final DatagramSocket socket = new DatagramSocket(9800);
    socket.setBroadcast(true);
    socket.setSoTimeout(5000);
    final byte[] data = "A-UDP-BROADCAST".getBytes();
    byte[] buffer = new byte[1024];

    socket.send(new DatagramPacket(data, data.length, addr, 9800));

    while (true) {
        try {
            final DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            socket.receive(packet);
            System.out.println(new String(packet.getData()));

        } catch (SocketTimeoutException e) {
            System.out.println("Timed out.");
            return;
        }
        buffer = new byte[1024];
    }

这一定是本段代码中的一个问题,因为当我发送一个带有外部程序(如PacketSender)的数据包时,我能够收到回复。

1 个答案:

答案 0 :(得分:1)

关于您的代码,我似乎错误的是如何将接收和发送套接字绑定到同一端口。没有setReuseAddress(),其中一个绑定应该失败。要解决这个问题,只需更改第二段代码中的第一行即可使用任何空闲端口:

final DatagramSocket socket = new DatagramSocket();