dartudpdatagram

How to set timeout function for RawDatagramSocket in Dart


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.


Solution

  • 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.