예제 #1
0
        private bool CheckSessionId(ref PacketReader reader, TPeer source)
        {
            var session = reader.ReadUInt32();

            if (session != _sessionId)
            {
                Log.Warn("Received a packet with incorrect session ID. Expected {0}, got {1}. Resetting client.", _sessionId, session);

                //Send back a packet forcing this client to disconnect. The client may reconnect, in which case it will re-run the entire handshake and acquire the correct session ID.
                var writer = new PacketWriter(new byte[7]);
                writer.WriteErrorWrongSession(_sessionId);
                SendUnreliable(source, writer.Written);

                return(false);
            }

            return(true);
        }
예제 #2
0
        private ushort?ProcessReceivedPacket(ArraySegment <byte> data)
        {
            var reader = new PacketReader(data);

            MessageTypes header;

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

            Log.Trace("Received Packet type: {0}", header);

            switch (header)
            {
            case MessageTypes.VoiceData:
                if (CheckSessionId(ref reader, header))
                {
                    _voiceReceiver.ReceiveVoiceData(ref reader);
                    _recvVoiceData.Update(reader.Read.Count);
                }
                break;

            case MessageTypes.TextData:
                if (CheckSessionId(ref reader, header))
                {
                    _textReceiver.ProcessTextMessage(ref reader);
                    _recvTextData.Update(reader.Read.Count);
                }
                break;

            case MessageTypes.HandshakeResponse:
                _serverNegotiator.ReceiveHandshakeResponseHeader(ref reader);
                _peers.ReceiveHandshakeResponseBody(ref reader);
                _recvHandshakeResponse.Update(reader.Read.Count);

                if (_serverNegotiator.LocalId.HasValue)
                {
                    OnServerAssignedSessionId(_serverNegotiator.SessionId, _serverNegotiator.LocalId.Value);
                }

                break;

            case MessageTypes.RemoveClient:
                if (CheckSessionId(ref reader, header))
                {
                    _peers.ProcessRemoveClient(ref reader);
                    _recvRemoveClient.Update(reader.Read.Count);
                }
                break;

            case MessageTypes.ClientState:
                if (CheckSessionId(ref reader, header))
                {
                    _peers.ProcessClientState(null, ref reader);
                    _recvClientState.Update(reader.Read.Count);
                }
                break;

            case MessageTypes.DeltaChannelState:
                if (CheckSessionId(ref reader, header))
                {
                    _peers.ProcessDeltaChannelState(ref reader);
                    _recvDeltaState.Update(reader.Read.Count);
                }
                break;

            case MessageTypes.ErrorWrongSession:
            {
                var session = reader.ReadUInt32();
                if (_serverNegotiator.SessionId != session)
                {
                    FatalError(string.Format("Kicked from session - wrong session ID. Mine:{0} Theirs:{1}", _serverNegotiator.SessionId, session));
                }
            }
            break;

            case MessageTypes.HandshakeP2P:
                if (CheckSessionId(ref reader, header))
                {
                    ushort id;
                    reader.ReadhandshakeP2P(out id);

                    _recvHandshakeP2P.Update(reader.Read.Count);

                    return(id);
                }
                break;

            case MessageTypes.ServerRelayReliable:
            case MessageTypes.ServerRelayUnreliable:
            case MessageTypes.HandshakeRequest:
                Log.Error("Client received packet '{0}'. This should only ever be received by the server", header);
                break;

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

            return(null);
        }
예제 #3
0
        /// <summary>
        /// Receive a packet from the network for dissonance
        /// </summary>
        /// <param name="source">An integer 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)
        {
            var reader = new PacketReader(data);

            var magic = reader.ReadUInt16();

            if (magic != PacketWriter.Magic)
            {
                Log.Warn("Received packet with incorrect magic number. Expected {0}, got {1}", PacketWriter.Magic, magic);
                return;
            }

            var header = (MessageTypes)reader.ReadByte();

            if (header != MessageTypes.HandshakeRequest)
            {
                var session = reader.ReadUInt32();
                if (session != _sessionId)
                {
                    Log.Warn("Received a packet with incorrect session ID. Expected {0}, got {1}. Resetting client.", _sessionId, session);
                    SendErrorWrongSession(source, _sessionId);
                    return;
                }
            }

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

            case MessageTypes.PlayerRoutingUpdate:
                Log.Error("Received a routing update (this should only ever be received by the client)");
                break;

            case MessageTypes.VoiceData:
                RecvVoiceData.Update(data.Count);
                _packetRouter.ProcessVoiceData(source, ref reader);
                break;

            case MessageTypes.TextData:
                RecvTextData.Update(data.Count);
                _packetRouter.ProcessTextData(ref reader);
                break;

            case MessageTypes.HandshakeRequest:
                RecvHandshakeRequest.Update(data.Count);
                ClientDisconnected(source);     // disconnect existing peers on this connection
                ((IServer <TPeer>) this).SendReliable(source, _handshakeResponse);
                break;

            case MessageTypes.HandshakeResponse:
                Log.Error("Received a handshake response (this should only ever be received by the client)");
                break;

            case MessageTypes.ErrorWrongSession:
                Log.Error("Received wrong session error from client (this should only ever be received by the client)");
                break;

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