Dart - 发送UDP广播

10

由于我似乎找不到一种使用Dart在本地网络内发送UDP广播的方法,因此我请求帮助。

目前,我已经使用RawDatagramSocket与UDP通信。我可以向特定地址发送消息。

我的问题是我无法向本地网络中的任何设备发送广播(网络掩码为255.255.255.0),并等待可能的(多个)回答。这是我正在使用的代码:

RawDatagramSocket.bind('127.0.0.1', 8889)
    .then((RawDatagramSocket udpSocket) {
        udpSocket.listen((e) {
            Datagram dg = udpSocket.receive();
            if (dg != null) {
                //stuff
            }
        });
        udpSocket.send(utf8.encode('TEST'), DESTINATION_ADDRESS, 8889);
});

我尝试使用InternetAddress.anyIPv4替换DESTINATION_ADDRESS,但是没有成功。我在RawDatagramSocket中找到了broadcastEnabled属性,但是我找不到更多关于如何使用它的信息。

提前感谢你的帮助。


广播UDP通常会因其负载而被网络设备阻止。考虑使用组播将消息发送给多个接收者。 - Andy Brown
2个回答

12

有两个问题:

  1. 使用 InternetAddress.anyIPv4 绑定所有网络接口;

  2. 启用广播权限,使用属性 broadcastEnabled

显然要使用广播地址:对于一个 /24 网络,请使用 x.y.z.255 地址。

这段代码可以正常工作:

import 'dart:io';
import 'dart:convert';

main() {

  var DESTINATION_ADDRESS=InternetAddress("x.y.z.255");

  RawDatagramSocket.bind(InternetAddress.anyIPv4, 8889).then((RawDatagramSocket udpSocket) {
    udpSocket.broadcastEnabled = true;
    udpSocket.listen((e) {
      Datagram dg = udpSocket.receive();
      if (dg != null) {
        print("received ${dg.data}");
      }
    });
    List<int> data =utf8.encode('TEST');
    udpSocket.send(data, DESTINATION_ADDRESS, 8889);
  });
}

不幸的是,这一直是我的第一种方法(我刚刚使用您的片段再次测试了它),但它不起作用。假设我有一个在“x.y.z.5”处监听UDP数据包的服务器:如果DESTINATION_ADDRESS设置为“x.y.z.255”,则服务器不会收到任何内容,但如果设置为“x.y.z.5”,则服务器会正确地接收数据包。 - Alessandro
对我来说,在同一主机上运行正常。这应该是接收方的问题。你是否绑定到广播地址 x.y.x.255 - attdona
谢谢,我设法让它工作了,但实际上并没有解决我的问题。问题是,我正在使用Flutter,我认为提到Dart或Flutter应该是等效的。结果证明不是这样的。在一个简单的.dart脚本中广播可以工作,并且我甚至能够从另一个主机接收消息。但是在Flutter中,同样的脚本却无法工作。你能帮我吗,还是我应该寻求新问题的帮助? - Alessandro
听起来你在使用模拟器。尝试使用真实设备,应该可以正常工作。 - attdona
2
我该如何启用broadcastEnabled的权限? - Yogesh Chawla
显示剩余6条评论

0
socket.send(
  'HELLO!'.codeUnits,
  InternetAddress('255.255.255.255'),
  8080,
);

尝试使用局域网而不是无线局域网。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接