How to set timeout function for RawDatagramSocket in Dart

384 Views Asked by At

I have a Dart application which receives udp datagram every 10ms. I want to know when data stream is stopped. I have a RawDatagramSocket as _udpSocket I can listen datagram by using this function:

RawDatagramSocket? _udpSocket;

Future<void> bindSocket() async {
   _udpSocket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, port);
   setTimeout();
}

Future<void> listen() async {
 _udpSocket?.listen((event) async {
   Datagram? d = _udpSocket?.receive();
   if (d == null) {
     return;
   }
   //handle received data
 });
}

And also I have a function to handle timeout:

void setTimeout() {
   //if there is no data receiving in a couple of cycle, time out will be triggered.
   //1 cycle == 10ms, I want timeout to be triggered after 10 cycles. (100ms)
   _udpSocket?.timeout(timeoutDuration, onTimeout: (sink) {
        //Handle time out
   });
}

I am able to receive and process incoming data, but timeout function is not working. Is there anything wrong with my code, or is there any other method to do what I want.

1

There are 1 best solutions below

0
aedemirsen On BEST ANSWER

I figured it out,I updated the listen function. Here is the update for those who would need it:

final Duration timeoutDuration = const Duration(milliseconds: 100);
@override
Future<void> listen() async {
  _udpSocket?.timeout(timeoutDuration, onTimeout: ((sink) {
    //do your work when data stream closed
  })).listen((event) async {
    Datagram? d = _udpSocket?.receive();
    if (d == null) {
      return;
    }
    //handle received data
  });
}

I hope it will be useful.