requestUDP1 function

Future<void> requestUDP1(
  1. UdpAddress address,
  2. List<Uint8List> frames,
  3. Peer peer
)

Implementation

Future<void> requestUDP1(
    UdpAddress address, List<Uint8List> frames, Peer peer) async {
  InternetAddress bindAddr = InternetAddress.anyIPv4;

  if (address.address.rawAddress.length == 16) {
    if (address.address.rawAddress[10] == 255 &&
        address.address.rawAddress[11] == 255) {
      address = UdpAddress(
          InternetAddress.fromRawAddress(
              address.address.rawAddress.sublist(12)),
          address.port);
    }
  }

  var udpSocket = await RawDatagramSocket.bind(bindAddr, 0);
  //udpSocket.broadcastEnabled = true;
  udpSocket.listen(
      (event) {
        if (event == RawSocketEvent.write) {
          for (var fr in frames) {
            for (var i = 0; i < 10; i++) {
              var sentBytes = udpSocket.send(fr, address.address, address.port);
              if (sentBytes == fr.length) {
                break;
              }
              print("Sent Error $sentBytes");
            }
          }
        }
        if (event == RawSocketEvent.read) {
          Datagram? dg = udpSocket.receive();
          if (dg != null) {
            peer.processFrame(UdpAddress(dg.address, dg.port), "UDP", dg.data);
            //result = UdpResponse(UdpAddress(dg.address, dg.port), dg.data);
          }
        }

        if (event == RawSocketEvent.closed) {
          udpSocket.close();
        }
        if (event == RawSocketEvent.readClosed) {
          udpSocket.close();
        }
      },
      cancelOnError: true,
      onDone: () {
        udpSocket.close();
      },
      onError: (err) {
        udpSocket.close();
      });

  await Future.delayed(const Duration(milliseconds: 3000));
  udpSocket.close();
}