java - 用 Java 广播 UDP 数据包的正确方法是什么?

标签 java sockets network-programming udp broadcast

我需要在每个网络接口(interface)上广播一个 UDP 数据包。起初,我尝试向 255.255.255.255 广播,没有结果,后来我发现这个“已经被弃用了大约 20 年”。所以我尝试在每个网络接口(interface)上迭代以获得接口(interface)的广播地址,然后将 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

这真的很烦人。我是否应该获取每个网络接口(interface)的 IP 地址和网络掩码并执行按位运算以“构建”正确的广播地址? This seems to me like Unix socket programming in C ...是否有一种干净的 Java 方法可以巧妙地将一个糟糕的 UDP 数据包传送到挤满我网络的所有伙伴?

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

最佳答案

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

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

关于java - 用 Java 广播 UDP 数据包的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8253938/

相关文章:

java - 在实际 Java 程序中使用 IPv6

java - Bukkit PlayerInteractEvent 不起作用

Java根据字符串名称动态实例化类

python - python中使用select从多个连接接收数据

C++ 我可以在没有计时器的情况下制作 boost::asio 连接套接字吗?

c - 使用 recv 通过网络接收字符串

java - 如何分析XML文件?

java - Vaadin ComboBox 将文本字段宽度设置为 0(CSS 阴影 dom)

C++ TCP 套接字插件

python - Flask Python - 将主机更改为 0.0.0.0 后,Put 请求仅返回 404