繁体   English   中英

在 Java 中广播 UDP 数据包的正确且有效的方法是什么?

[英]What's the correct and working way to broadcast an UDP packet in Java?

我需要在每个网络接口上广播一个 UDP 数据包。 起初,我尝试广播到255.255.255.255 ,没有结果,后来我发现这个“已经被弃用了大约20年”。 因此,我尝试在每个网络接口上进行迭代,以获取接口的广播地址,然后向该地址发送 UDP 数据包。

仍然,以下代码:

public static Collection<InetAddress> getBroadcastAddresses() {
    try {
        Collection<InetAddress> result = new LinkedList<InetAddress>();
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
                for (InterfaceAddress address : netint.getInterfaceAddresses()) {
                    InetAddress broadcastAddress = address.getBroadcast();
                    if (broadcastAddress != null)
                        result.add(broadcastAddress);
                }
        return result;
    } catch (SocketException e) {
        throw new RuntimeException(e);
    }
}

public static void broadcast(int port, DatagramPacket packet,
        DatagramSocket socket, PrintWriter logger) throws IOException {

    packet.setPort(port);

    for (InetAddress address : getBroadcastAddresses()) {
        logger.println("Broadcasting to: "+address);
        packet.setAddress(address);
        socket.send(packet);
    }
    
}

打印这个东西:

Broadcasting to: /0.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255

这真的很烦人。 我是否应该获取每个网络接口的 IP 地址和网络掩码并执行按位操作以“构建”正确的广播地址? 在我看来,这就像 C 语言中的 Unix 套接字编程......是否有一种干净的 Java 方式可以巧妙地将一个糟糕的 UDP 数据包传递给我网络中的所有伙伴?

编辑:在网上搜索,结果这次我的代码没有坏。 相反,JVM 是。 您从InterfaceAddress.getBroadcast()获得的数据是不一致的,至少在 Windows 7 下是这样。例如,请参阅thisthis :解决方案似乎设置了 Java 系统属性,以使其更喜欢 IPv4 而不是 IPv6,但这并没有为我工作。 即使采用了建议的解决方法,每次不同的运行我都会得到不同的结果,而且由于我得到的广播地址显然是随机的,我怀疑我得到了来自未定义状态内存位置的数据。

您需要获取网络 IP 并标记并使用它进行广播。 那简单的部分。 然后你需要收集所有的回复,知道一些服务器可能没有收到 UDP 数据包,并且一些回复可能已经丢失。 您必须考虑到 UDP 被设计为不可靠的事实。

我会直接解析 ipconfig /all 以获取 IP 和子掩码。 即使 ipconfig 也只有 IPv4 的子掩码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM