【问题标题】:How to receive broadcast packet on 0.0.0.0?如何在 0.0.0.0 上接收广播包?
【发布时间】:2012-06-29 22:22:33
【问题描述】:

我的 Java 应用程序需要一些帮助。我需要在绑定到通配符地址的数据报套接字上接收广播数据包。最重要的是,我的 wlan0 不应配置 IP 地址,因为此应用程序的目标是从服务器检索有效 IP,类似于 DHCP。
首先我在 0.0.0.0 上配置 wlan0。
此外,我将默认路由设置为通过 wlan0 接口(唯一的接口)。
ifconfig 输出为:

lo    Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:117 errors:0 dropped:0 overruns:0 frame:0
      TX packets:117 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:9337 (9.3 KB)  TX bytes:9337 (9.3 KB)


wlan0     Link encap:Ethernet  HWaddr 00:1b:77:dd:e7:a4  
      inet6 addr: fe80::21b:77ff:fedd:e7a4/64 Scope:Link
      UP BROADCAST MULTICAST  MTU:1500  Metric:1
      RX packets:30211 errors:0 dropped:1 overruns:0 frame:0
      TX packets:6128 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:16654450 (16.6 MB)  TX bytes:654646 (654.6 KB)

这就是我在客户端上创建套接字的方式:

InetSocketAddress broadcast = new InetSocketAddress("0.0.0.0",listenPort);
socket = new DatagramSocket(null);
socket.setSoTimeout(5000);
socket.setBroadcast(true);
socket.bind(new InetSocketAddress(broadcast.getPort()));

然后我将数据报包从客户端发送到 255.255.255.255。服务器(在同一子网上)接收它们并在子网上通过广播进行应答。客户端机器接收到服务器的广播数据包,但套接字没有,它在 socket.receive() 上阻塞自己;

有没有办法在绑定到未配置(无 IP)接口的套接字上接收数据报?

我尝试为 wlan0 提供 IP 并且一切正常,但我需要不配置 wlan0,只绑定到 0.0.0.0 通配符地址。

【问题讨论】:

  • 您使用的是同一个套接字发送和接收,对吧?
  • 会不会引起问题?我应该在不同的套接字上接收吗?
  • 不,保持相同的套接字。使用两个会更难。

标签: java sockets broadcast dhcp datagram


【解决方案1】:

bind() 肯定会抛出 IOExceotion,因为套接字在构造时已经绑定?

将 new DatagramSocket(null) 更改为 new DatagramSocket(broadcast);删除 bind() 调用;并将 new InetSocketAddress() 的第一个参数从 '0.0.0.0' 更改为 null。

【讨论】:

  • 不抛出异常。我做了你建议的改变,但没有任何改变。数据包到达但套接字没有得到它。如果我用 IP 地址配置 wlan0,一切正常,如果我在通配符地址 0.0.0.0 上配置它,它就不起作用。似乎不可能在通配符地址绑定套接字上接收广播..是真的吗?有什么解决办法吗?
  • @EJP new DatagramSocket(null) 阻止它绑定到地址。您指的是当使用 new DatagramSocket() (默认的非参数化构造函数)时 - 将其绑定到系统分配的端口。
【解决方案2】:

在调用“setBroadcast”和“setSoTimeout”之前执行“绑定”调用

【讨论】:

  • 没有任何改变。我检查是否启用了 SO_BROADCAST 并且是。我不认为这是一个绑定问题。我环顾四周,似乎在 java 中无法在未配置的接口上接收绑定到通配符地址的套接字上的广播数据包。这是真的吗?你知道有什么解决办法吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多