java - 通过交叉连接进行 UDP 广播

标签 java sockets networking network-programming udp

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

这是获取所有接口(interface)的代码,它返回交叉连接的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)发送数据包时,我能够收到回复。

最佳答案

在我看来,您的代码的错误在于您如何将接收和发送套接字绑定(bind)到同一端口。如果没有 setReuseAddress(),其中一个绑定(bind)将会失败。要解决这个问题,只需更改第二段代码中的第一行以使用任何空闲端口:

final DatagramSocket socket = new DatagramSocket();

关于java - 通过交叉连接进行 UDP 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42099459/

相关文章:

java - Maven Jaxb2插件抛出错误 "undefined element declaration ' s :schema' "

ios - 无法在iOS UDP套接字中获取数据回调

python - 当你抛出异常时,Python 对象会发生什么

sockets - 在台球多人游戏中同步物理

java - java中的Azure应用程序功能用于查看azure存储帐户中的blob文件列表

java - 如何为 jni C++ 函数传递 ArrayList<Point>?

linux - 有关网络和微 Controller 的书籍?

python - 使用 Python/iptables 拦截通过 Linux Bridge 的 UDP 数据包

java - 持久对象的历史、差异和恢复

C++ 如何通过套接字发送对象?