public bool TcpAuthenticateClient(IDoubleServerClient client, BitBuffer buffer, out byte[] encryptionKey, out byte errorCode) { Console.WriteLine("Server TCP authenticated client"); encryptionKey = buffer.ReadBytes(); errorCode = 0; return(true); }
public void OnUdpReceived(IDoubleServerClient client, BitBuffer buffer, ushort packetTimestamp) { NetworkServerClient serverClient = (NetworkServerClient)client.ExtraData; if (serverClient.TakeResetPacketTimestamp()) { serverClient.LastPacketTimestamp = packetTimestamp; } else if (!DoubleProtocol.IsPacketNewest(ref serverClient.LastPacketTimestamp, packetTimestamp)) { return; } byte[] bytes = buffer.ReadBytes(); // ReSharper disable once ConvertToLocalFunction Action handler = () => { if (_server != null) { _handlerBuffer.SetContents(bytes); UdpHandler(serverClient, _handlerBuffer); } }; if (!NetworkUtils.SimulateNetworkConditions || NetworkUtils.IsLocal(serverClient.Id)) { UnityFixedDispatcher.InvokeNoDelay(handler); } else { UnityFixedDispatcher.InvokeDelayed(NetworkUtils.SimulatedNetDelay, handler); } }
public Action <BitBuffer> OnFullAuthentication(IDoubleServerClient client) { byte newId = 0; while (_players.Any(p => p.Id == newId)) { newId++; } Player newPlayer = new Player(client, newId, _colors.Dequeue()); client.ExtraData = newPlayer; foreach (Player player in _players) { _server.SendTcp(player.ServerClient, buffer => { buffer.Write(true); buffer.WriteBits(newPlayer.Id, 2); buffer.WriteBits(newPlayer.Color, 2); }); } _players.Add(newPlayer); return(buffer => { buffer.WriteBits((ulong)_players.Count, 2); foreach (Player player in _players) { buffer.WriteBits(player.Id, 2); buffer.WriteBits(player.Color, 2); } }); }
public bool TcpAuthenticateClient(IDoubleServerClient client, BitBuffer buffer, out byte[] encryptionKey, out byte errorCode) { encryptionKey = buffer.ReadBytes(); errorCode = 0; client.ExtraData = new NetworkServerClient(client); return(true); }
public void OnUdpReceived(IDoubleServerClient client, BitBuffer buffer, ushort packetTimestamp) { Player player = (Player)client.ExtraData; if (DoubleProtocol.IsPacketNewest(ref player.NewestPacketTimestamp, packetTimestamp)) { player.X = (byte)buffer.ReadBits(4); player.Y = (byte)buffer.ReadBits(4); } }
/// <summary> /// Sends the specified payload over TCP to the specified client. /// </summary> /// <param name="recipient">The client in question.</param> /// <param name="payloadWriter">The action which writes the payload to a buffer.</param> public void SendTcp(IDoubleServerClient recipient, Action <BitBuffer> payloadWriter) { lock (this) { if (_closed) { return; } DoubleServerClient client = (DoubleServerClient)recipient; SendEncryptedLengthPrefixOnlyTcp(client.TcpSocket, client.EncryptionKey, buffer => { buffer.Write(client.NextSendSequenceId()); payloadWriter(buffer); }); } }
/// <summary> /// Sends the specified payload over UDP to the specified client. /// </summary> /// <param name="recipient">The client in question.</param> /// <param name="payloadWriter">The action which writes the payload to a buffer.</param> public void SendUdp(IDoubleServerClient recipient, Action <BitBuffer> payloadWriter) { lock (this) { if (_closed) { return; } DoubleServerClient client = (DoubleServerClient)recipient; using (_sendBuffer) { UdpHelper.WritePrefix(_sendBuffer, client.ConnectionStartTimestamp, payloadWriter); byte[] encrypted = _crypto.Encrypt(client.EncryptionKey, _sendBuffer.Array, 0, _sendBuffer.Size); _udp.Send(client.UdpEndPoint, encrypted, 0, encrypted.Length); } } }
public void OnLostConnection(IDoubleServerClient client, DoubleServer.ClientState state) { if (state == DoubleServer.ClientState.Authenticated) { UnityFixedDispatcher.InvokeNoDelay(() => { if (_server != null) { NetworkServerClient serverClient = (NetworkServerClient)client.ExtraData; lock (UdpPayloadLock) { //Don't let the TickingThread send before the client is deinitialized _clients.Remove(serverClient); DisconnectHandler(serverClient); } } }); } }
public Action <BitBuffer> OnFullAuthentication(IDoubleServerClient client) { NetworkServerClient serverClient = (NetworkServerClient)client.ExtraData; serverClient.Initialize(); UnityFixedDispatcher.InvokeNoDelay(() => { if (_server != null) { lock (UdpPayloadLock) { //Don't let the TickingThread send before the client is initialized _clients.Add(serverClient); ConnectHandler(serverClient); } } }); return(buffer => { buffer.Write(serverClient.Id); buffer.Write(NetworkUtils.GlobalBaseTimestamp); }); }
public void OnLostConnection(IDoubleServerClient client, DoubleServer.ClientState state) { if (state != DoubleServer.ClientState.Authenticated) { return; } Player disconnectedPlayer = (Player)client.ExtraData; _players.Remove(disconnectedPlayer); _colors.Enqueue(disconnectedPlayer.Color); foreach (Player player in _players) { _server.SendTcp(player.ServerClient, buffer => { buffer.Write(false); buffer.WriteBits(disconnectedPlayer.Id, 2); }); } }
public void OnTcpReceived(IDoubleServerClient client, BitBuffer buffer) { if (buffer.TotalBitsLeft < 8) { return; } byte packet = buffer.ReadByte(); if (packet >= TcpHandlers.Length) { return; } byte[] bytes = buffer.ReadBytes(); NetworkServerClient serverClient = (NetworkServerClient)client.ExtraData; // ReSharper disable once ConvertToLocalFunction Action handler = () => { if (_server != null) { OnPacketReceived action = TcpHandlers[packet]; if (action != null) { _handlerBuffer.SetContents(bytes); action((NetworkServerClient)client.ExtraData, _handlerBuffer); } } }; if (!NetworkUtils.SimulateNetworkConditions || NetworkUtils.IsLocal(serverClient.Id)) { UnityFixedDispatcher.InvokeNoDelay(handler); } else { UnityFixedDispatcher.InvokeDelayed(NetworkUtils.SimulatedNetDelay, handler); } }
/// <summary> /// Kicks a specific client. /// </summary> /// <param name="client">The client in question.</param> public void Disconnect(IDoubleServerClient client) { lock (this) { if (_closed) { return; } DoubleServerClient impl = (DoubleServerClient)client; impl.Disconnected(); _tcpClients.Remove(impl.TcpSocket); _tcp.Disconnect(impl.TcpSocket); if (impl.UdpEndPoint != null) { _udpClients.Remove(impl.UdpEndPoint); } if (impl.State != ClientState.TcpAuthenticating && _authenticatedCount-- == _maxAuthenticatedCount) { _tcp.StartAccepting(); } } }
public NetworkServerClient(IDoubleServerClient doubleClient) { DoubleClient = doubleClient; }
public Action <BitBuffer> OnFullAuthentication(IDoubleServerClient client) { Console.WriteLine("Server fully authenticated client"); return(buffer => buffer.Write(FinalAuthenticationPacketPayload)); }
public void OnTcpReceived(IDoubleServerClient client, BitBuffer buffer) { Console.WriteLine("SRec TCP " + buffer.TotalBitsLeft); Server.SendTcp(client, buff => buff.Write(buffer.Array, buffer.Offset, buffer.Size)); }
public void OnTcpReceived(IDoubleServerClient client, BitBuffer buffer) { Console.WriteLine("Received " + buffer.TotalBitsLeft + " bits over TCP; this shouldn't happen."); }
public void OnUdpReceived(IDoubleServerClient client, BitBuffer buffer, ushort packetTimestamp) { Console.WriteLine("SRec UDP " + buffer.TotalBitsLeft + " " + packetTimestamp); Server.SendUdp(client, buff => buff.Write(buffer.Array, buffer.Offset, buffer.Size)); }
public Player(IDoubleServerClient serverClient, byte id, byte color) { ServerClient = serverClient; Id = id; Color = color; }
public void OnLostConnection(IDoubleServerClient client, DoubleServer.ClientState state) { Console.WriteLine($"Server lost connection to client ({state})"); }