背景故事:
我有一个无线设备,它创建自己的 SSID,使用 auto-ip 为自己分配一个 IP 地址,并开始向 255.255.255.255 广播发现信息。(不幸的是,它不容易支持多播)
我正在尝试做的事情:
我需要能够接收发现信息,然后将配置信息发送到设备。问题是,使用自动 IP,“IP 协商”过程在 Windows 等上可能需要几分钟(在此期间我可以看到广播,甚至可以将广播信息发送回设备)。
所以我枚举了所有连接的网络接口(不能直接告诉哪个将用于与设备通信),为它们的每个地址创建一个 DatagramSocket,然后开始监听。如果我通过特定套接字接收发现信息,我知道我可以使用同一个套接字将数据发送回设备。这适用于 Windows。
问题:
在 Linux 和 OSX 上,以下代码不接收广播数据包:
byte[] addr = {(byte)169, (byte)254, (byte)6, (byte)215};
DatagramSocket foo = new DatagramSocket(new InetSocketAddress(InetAddress.getByAddress(addr), PORT_NUM));
while (true)
{
byte[] buf = new byte[256];
DatagramPacket pct = new DatagramPacket(buf, buf.length);
foo.receive(pct);
System.out.println( IoBuffer.wrap(buf).getHexDump() );
}
为了接收广播数据包(在 Linux/OSX 上),我需要使用以下方法创建我的 DatagramSocket:
DatagramSocket foo = new DatagramSocket(PORT_NUM);
但是,当我随后使用此套接字将数据发送回设备时,数据包由操作系统路由(我假设)并且由于感兴趣的接口可能处于自动 ip 协商的中间,因此失败。
有以下想法吗?
- 如何在 Linux/OSX 上实现“工作”的 Windows 行为
- 处理此过程的更好方法
提前致谢!