2

我已经编写了一个基本代码,使用这个链接从 java 中的 windows 机器多播 UDP 数据包。接收器是几部安卓手机,它们运行同一链接中给出的接收器代码。

这是发件人代码:

int mcPort = 4446;
String mcIPStr = "225.4.5.6";

InetAddress group = InetAddress.getByName(mcIPStr);
DatagramSocket udpSocket = new DatagramSocket();
byte[] c = "SENT".getBytes();
DatagramPacket packet = new DatagramPacket(c, c.length, group, mcPort);
udpSocket.send(packet);
udpSocket.close();

这是接收器代码:

int mcPort = 4446;
MulticastSocket mcSocket = new MulticastSocket(mcPort);
InetAddress group = InetAddress.getByName("225.4.5.6");
mcSocket.joinGroup(group);
DatagramPacket packet = new DatagramPacket(new byte[PACKET_SIZE],PACKET_SIZE);

mcSocket.receive(packet);

byte[] data = packet.getData();
String msg = new String(data);
System.out.println("message:"+msg);

当windows机器与接收节点连接到同一个wifi时,数据包被正确接收。但我想在没有外部 wifi 的情况下实现相同的功能。

所以我使用这个链接将我的 Windows 机器配置为一个接入点。节点现在已连接到此 AP。根据我的理解,节点现在应该收到数据包,但他们没有!

我错过了什么?

4

1 回答 1

1

啊,好痛。多播路由是微妙的。

对于大多数 Wifi 驱动程序来说,作为 AP 运行的 PC 是一个奇特的用例。一些 Wifi 驱动程序仅在 AP 模式下提供有限的功能。也许您的驱动程序根本不支持多播,或者它只是无法为多播设置默认路由。

您可以检查和尝试的事情:

  • 您是否通过正确的网络接口发送多播数据包?当您处于 AP 模式时,默认网络接口可能不再正确。我在您的发件人代码中看不到您明确绑定到网络适配器的位置。令人困惑的是,这通常由 Windows(以及 Linux)上的 IP-Address 完成,尽管还有其他(非标准)替代方案。

  • 尝试将发送方放到另一台 Windows PC 上,并将它也连接到作为 AP 运行的 Windows PC。它现在有效吗?然后只是多播数据包的本地路由被搞砸了。

  • Wireshark 在本地环回设备上说什么?(您必须安装 npcap 才能获得环回设备,但这对于诊断此类问题非常有用,可以查看本地发生的情况。)

  • 本地接收(在 AP 上运行)接收什么?

于 2015-12-17T20:34:43.150 回答