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