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); }
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); }
/// <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; } }