コード例 #1
0
ファイル: Connection.cs プロジェクト: qcjxberin/unity_rudp
    public static void process_ack(uint ack, uint ack_bits, ref PacketQueue pending_ack_queue,
                                   ref PacketQueue acked_queue, ref List <uint> acks,
                                   uint acked_packets, float rtt, uint max_sequence)
    {
        if (pending_ack_queue.Count == 0)
        {
            return;
        }
        var node = pending_ack_queue.First;

        while (node != null)
        {
            var nextnode = node.Next;

            bool acked = false;
            if (node.Value.sequence == ack)
            {
                acked = true;
            }
            else if (!sequence_more_recent(node.Value.sequence, ack, max_sequence))
            {
                uint bit_index = bit_index_for_sequence(node.Value.sequence, ack, max_sequence);
                if (bit_index <= 31)
                {
                    acked = System.Convert.ToBoolean((ack_bits >> (int)bit_index) & 1);
                }
            }
            if (acked)
            {
                rtt += (node.Value.time - rtt) * 0.1f;

                acked_queue.insert_sorted(node.Value, max_sequence);
                acks.Add(node.Value.sequence);
                acked_packets++;
                pending_ack_queue.Remove(node);
                node = nextnode;
            }
            else
            {
                node = nextnode;
            }
        }
    }