gpt4 book ai didi

监听广播地址的 Java DatagramSocket

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:45:07 24 4
gpt4 key购买 nike

我已经编写了简单的测试类,用于监听 Eth 并接收所有 UDP 数据包,这些数据包将转到端口 5001:

public class Main {

public static void main(String[] args) throws SocketException, UnknownHostException, IOException {
DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("255.255.255.255"));
socket.setBroadcast(true);
System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast());
byte[] buf = new byte[512];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
while (true) {
System.out.println("Waiting for data");
socket.receive(packet);
System.out.println("Data received");
}
}
}

它不再起作用了。它打印出 Waiting for data 并且永远不会继续。 tcpdump 告诉我,UDP 广播数据包来了。我究竟做错了什么?非常感谢。

最佳答案

接收方无法监听广播地址。

广播地址是给发送者的——发送者可以发送一个以 255.255.255.255:5001 作为目的地的数据包,所有在子网中监听该端口的接收者都会收到它。但是没有办法创建一个可以接收“所有 UDP 数据包”的接收器。

如果你已经有一个广播发送者并且想要接收它的数据包,你需要改为监听一个通配符地址:

DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("0.0.0.0")); 

关于监听广播地址的 Java DatagramSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5472269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com