【问题标题】:Dart - Send an UDP broadcastDart - 发送 UDP 广播
【发布时间】:2019-06-17 02:00:36
【问题描述】:

我正在寻求帮助,因为我似乎找不到使用 Dart 在本地网络内发送 UDP 广播的方法。

到目前为止,我设法使用 UDP 与 RawDatagramSocket 进行通信。我可以向特定地址发送消息。

我不能做的是向本地网络内的任何设备发送广播(网络掩码为 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 经常被网络设备阻止,因为它造成的负载。考虑使用多播将消息发送给多个接收者。

标签: sockets dart udp broadcast


【解决方案1】:

有两个问题:

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

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

显然使用广播地址:/24 网络使用x.y.z.255 地址。

这个 sn-p 有效:

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);
  });
}

【讨论】:

  • 不幸的是,这是我的第一种方法(我刚刚使用您的 sn-p 再次对其进行了测试),但它不起作用。假设我有一个服务器在“xyz5”侦听 UDP 数据包:如果 DESTINATION_ADDRESS 设置为“xyz255”,则服务器不会收到任何内容,但如果它设置为“xyz5”,则服务器正确接收数据包.
  • 对我来说,它使用相同的主机。应该是接收端的问题。你是绑定广播地址x.y.x.255吗?
  • 谢谢,我设法让它工作,虽然它实际上并没有解决我的问题。问题是,我正在使用 Flutter,我认为提到 Dart 或 Flutter 是等价的。事实证明不是。在一个简单的.dart 脚本中,广播工作,我什至能够从另一个主机接收消息。使用 Flutter,相同的脚本不起作用。你能帮我吗,还是我应该寻求帮助来提出一个新问题?
  • 听起来你在使用模拟器。试试真机,应该可以的。
  • 我应该如何启用broadcastEnabled权限
【解决方案2】:
socket.send(
  'HELLO!'.codeUnits,
  InternetAddress('255.255.255.255'),
  8080,
);

尝试使用 LAN 而不是 WLAN。

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 2012-11-09
    • 2020-02-21
    • 2018-11-03
    • 2014-06-23
    • 1970-01-01
    • 2015-03-14
    • 2021-07-30
    相关资源
    最近更新 更多