/// <summary> /// [Sender] Handle ack information from Receiver. /// </summary> /// <param name="packet"></param> public void OnDataAck(DataAckPacket packet) { foreach (var chunkSequence in packet.AckList) { DataPool[packet.DataSequence].Remove(chunkSequence); } Task.Run(async() => { await SendAck2Async(packet.AckSequence); }); }
/// <summary> /// [Receiver] Send AckList in queue /// </summary> /// <param name="dataSequence"></param> /// <returns></returns> public async Task SendAckAsync(int dataSequence) { DataAckPacket dataAckPacket = new DataAckPacket(ClientId, 0, dataSequence, AckList[dataSequence]); dataAckPacket.AckSequence = dataAckPacket.GetHashCode(); await Conn.SendAsync(dataAckPacket.Dgram, SenderIPEndPoint); AckStatusList[dataAckPacket.AckSequence] = 0; AckList[dataSequence].Clear(); while (AckStatusList[dataAckPacket.AckSequence] == 1) { await Task.Delay(1000); await Conn.SendAsync(dataAckPacket.Dgram, SenderIPEndPoint); } }