public static void Classify(UdpSocket udpSocket, ICollection <Receiver> receivers,
                                List <ConfirmPacketInfo> confirmPacketInfos,
                                Dictionary <int, SenderPacketInfo> senderPacketInfos)
    {
        foreach (var receiver in receivers)
        {
            senderPacketInfos.Add(receiver.SenderId, new SenderPacketInfo());
        }

        while (true)
        {
            var packet = udpSocket.Receive();
            if (packet == null)
            {
                break;
            }

            int senderId   = PacketUtils.getSessionIdFromSenderPacketBytes(packet.Bytes);
            var packetType = PacketUtils.getPacketTypeFromSenderPacketBytes(packet.Bytes);

            if (packetType == SenderPacketType.Confirm)
            {
                confirmPacketInfos.Add(new ConfirmPacketInfo(packet.EndPoint, ConfirmSenderPacket.Create(packet.Bytes)));
                continue;
            }

            // Ignore packet if it is sent from a sender without a corresponding receiver.
            if (!senderPacketInfos.TryGetValue(senderId, out SenderPacketInfo senderPacketInfo))
            {
                continue;
            }

            senderPacketInfo.ReceivedAny = true;
            switch (packetType)
            {
            case SenderPacketType.Heartbeat:
                break;

            case SenderPacketType.Video:
                senderPacketInfo.VideoPackets.Add(VideoSenderPacket.Create(packet.Bytes));
                break;

            case SenderPacketType.Parity:
                senderPacketInfo.ParityPackets.Add(ParitySenderPacket.Create(packet.Bytes));
                break;

            case SenderPacketType.Audio:
                senderPacketInfo.AudioPackets.Add(AudioSenderPacket.Create(packet.Bytes));
                break;
            }
        }
    }
 public ConfirmPacketInfo(IPEndPoint senderEndPoint, ConfirmSenderPacket confirmPacket)
 {
     SenderEndPoint = senderEndPoint;
     ConfirmPacket  = confirmPacket;
 }