Dart - отправка UDP-трансляции - PullRequest
0 голосов
/ 23 января 2019

Я прошу помощи, так как кажется, что я не могу найти способ отправить широковещательную рассылку UDP внутри локальной сети, используя Dart.

Пока мне удалось связаться по протоколу 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);
});

Я пытался заменить DESTINATION_ADDRESS на InternetAddress.anyIPv4, но мне не повезло. Я также нашел свойство broadcastEnabled внутри RawDatagramSocket, но не могу найти дополнительную информацию о том, как его использовать.

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019
socket.send(
  'HELLO!'.codeUnits,
  InternetAddress('255.255.255.255'),
  8080,
);

Попробуйте использовать LAN вместо WLAN.

0 голосов
/ 23 января 2019

Есть две проблемы:

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