背景故事:
我有一个无线设备创建自己的SSID,使用auto-ip为自己分配IP地址,并开始向255.255.255.255广播发现信息。 (不幸的是,它不会轻松支持多播)
我正在尝试做什么:
我需要能够接收发现信息,然后将配置信息发送到设备。问题是,使用auto-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协商失败。
关于以下内容的想法?
提前致谢!
答案 0 :(得分:0)
我不认为这是代码的问题。您是否检查过OSX / Linux是否通过防火墙正确地允许了这些地址/端口号?我过去也有这个简单的问题= P ..
仅供参考,有一种很好的技术称为零配置,它是为解决这个问题而设计的。这很容易学习,所以我建议你也要看一下。
祝你好运。