监听广播地址的Java DatagramSocket

rcs*_*-34 5 java broadcast

我编写了一个简单的测试类,用于监听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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

axt*_*avt 16

接收方无法收听广播地址.

广播地址用于发送者 - 发送者可以发送一个255.255.255.255:5001作为目的地的数据包,并且监听子网中该端口的所有接收者都将接收该数据包.但是没有办法创建一个可以接收"所有UDP数据包"的接收器.

如果您已有广播发送者并希望接收其数据包,则需要侦听通配符地址:

DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("0.0.0.0")); 
Run Code Online (Sandbox Code Playgroud)

  • 我不同意无法获得所有UDP流量.查找"Wireshark" - 它可以安静地监听计算机上任何界面上的所有网络流量...不会打扰流量..因为它存在并且有效,所以必须有*a*方式 (2认同)