如何从windows机器上以机器本身作为访问点进行多播



我已经编写了一个基本代码,使用此链接从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。根据我的理解,节点现在应该接收数据包,但他们没有!

我缺少的是什么?

啊,真是太痛苦了。多播路由是微妙的。

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

你可以检查和尝试的东西:

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

  • 尝试将发件人放到另一台Windows电脑上,并将其连接到以AP身份运行的Windows电脑。现在有效吗?然后,多播数据包的本地路由就被打乱了。

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

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

最新更新