gpt4 book ai didi

java - DatagramSocket 广播行为(Windows 与 Linux)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:49 25 4
gpt4 key购买 nike

背景故事:
我有一个无线设备,它创建自己的 SSID,使用自动 IP 为自己分配一个 IP 地址,并开始将发现信息广播到 255.255.255.255。 (不幸的是,它并不容易支持多播)

我正在尝试做的事情:
我需要能够接收发现信息,然后将配置信息发送到设备。问题是,使用自动 IP,“IP 协商”过程在 Windows 等设备上可能需要几分钟(在此期间我可以看到广播,甚至可以将广播信息发送回设备)。

所以我枚举了所有连接的网络接口(interface)(无法直接判断哪个将用于与设备通信),为它们的每个地址创建一个 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);

但是,当我随后使用此套接字将数据发送回设备时,数据包由操作系统路由(我假设)并且由于感兴趣的接口(interface)可能在中间自动IP协商,失败。

关于以下内容的想法?

  • 如何在 Linux/OSX 上实现“有效”的 Windows 行为
  • 处理此过程的更好方法

提前致谢!

最佳答案

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

仅供引用,有一项称为零配置的出色技术旨在解决此问题。它非常容易学习,所以我建议您也看一下。

祝你好运。

关于java - DatagramSocket 广播行为(Windows 与 Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16554460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com