Beispiel #1
0
        /// <summary>
        /// Receive a packet from the network for dissonance
        /// </summary>
        /// <param name="source">A value identifying where this packet came from (same ID will be used for sending)</param>
        /// <param name="data">Packet received</param>
        public void NetworkReceivedPacket(TPeer source, ArraySegment <byte> data)
        {
            if (_disconnected)
            {
                Log.Warn("Received a packet with a disconnected server, dropping packet");
                return;
            }

            var reader = new PacketReader(data);

            MessageTypes header;

            if (!reader.ReadPacketHeader(out header))
            {
                Log.Warn("Discarding packet - incorrect magic number.");
                return;
            }

            switch (header)
            {
            case MessageTypes.HandshakeRequest:
                RecvHandshakeRequest.Update(data.Count);
                _clients.ProcessHandshakeRequest(source, ref reader);
                break;

            case MessageTypes.ClientState:
                if (CheckSessionId(ref reader, source))
                {
                    RecvClientState.Update(data.Count);
                    _clients.ProcessClientState(source, ref reader);
                }
                break;

            case MessageTypes.ServerRelayReliable:
            case MessageTypes.ServerRelayUnreliable:
                if (CheckSessionId(ref reader, source))
                {
                    RecvPacketRelay.Update(data.Count);
                    _relay.ProcessPacketRelay(ref reader, header == MessageTypes.ServerRelayReliable, source);
                }
                break;

            case MessageTypes.DeltaChannelState:
                if (CheckSessionId(ref reader, source))
                {
                    RecvDeltaChannelState.Update(data.Count);
                    _clients.ProcessDeltaChannelState(ref reader);
                }
                break;

            case MessageTypes.HandshakeP2P:
            case MessageTypes.RemoveClient:
            case MessageTypes.VoiceData:
            case MessageTypes.TextData:
            case MessageTypes.HandshakeResponse:
            case MessageTypes.ErrorWrongSession:
                Log.Error("Server received packet '{0}'. This should only ever be received by the client", header);
                break;

            default:
                Log.Error("Ignoring a packet with an unknown header: '{0}'", header);
                break;
            }
        }