【问题标题】:What's the correct and working way to broadcast an UDP packet in Java?在 Java 中广播 UDP 数据包的正确且有效的方法是什么?
【发布时间】:2012-01-05 10:31:32
【问题描述】:

我需要在每个网络接口上广播一个 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 地址和网络掩码并执行按位运算来“构建”正确的广播地址? This seems to me like Unix socket programming in C... 有没有一种干净的 Java 方法可以巧妙地向挤满我网络的所有伙伴发送一个可悲的 UDP 数据包?

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

【问题讨论】:

    标签: java sockets network-programming udp broadcast


    【解决方案1】:

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

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

    【讨论】:

    • 设计不可靠。不太一样。
    • 我接受 UDP 的不可靠性。不过,这不是问题的重点...... :) 我在问是否有比使用 IP 地址和网络掩码更好的方法。
    • @EJP,我认为它旨在在负载下丢弃数据包。我不知道设计中是否提到了这一点。
    • @gd1,总之没有。我能想到的所有替代方案也需要您知道接口信息并且可能更复杂。广播 UDP 适用于您似乎正在尝试执行的任务。
    • @PeterLawrey IP 旨在丢弃数据包。与 TCP 不同,UDP 只是继承了它,并且什么也不做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多