1

背景故事:
我有一个无线设备,它创建自己的 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 行为
  • 处理此过程的更好方法

提前致谢!

4

1 回答 1

0

我不认为这是代码的问题。您是否检查过 OSX/Linux 是否正确允许这些地址/端口号通过其防火墙?我过去也遇到过这个简单的问题=P..

仅供参考,有一种名为零配置的好技术就是为解决这个问题而构建的。它很容易学习,所以我建议你也看看它。

祝你好运。

于 2013-05-14T23:41:48.237 回答