示例#1
0
 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);
 }
示例#2
0
            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);
                }
            }
示例#3
0
        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);
                }
            });
        }
示例#4
0
 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);
 }
示例#5
0
        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);
            }
        }
示例#6
0
        /// <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);
                });
            }
        }
示例#7
0
        /// <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);
                }
            }
        }
示例#8
0
 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);
                 }
             }
         });
     }
 }
示例#9
0
            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);
                });
            }
示例#10
0
        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);
                });
            }
        }
示例#11
0
            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);
                }
            }
示例#12
0
        /// <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();
                }
            }
        }
示例#13
0
 public NetworkServerClient(IDoubleServerClient doubleClient)
 {
     DoubleClient = doubleClient;
 }
示例#14
0
 public Action <BitBuffer> OnFullAuthentication(IDoubleServerClient client)
 {
     Console.WriteLine("Server fully authenticated client");
     return(buffer => buffer.Write(FinalAuthenticationPacketPayload));
 }
示例#15
0
 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));
 }
示例#16
0
 public void OnTcpReceived(IDoubleServerClient client, BitBuffer buffer)
 {
     Console.WriteLine("Received " + buffer.TotalBitsLeft + " bits over TCP; this shouldn't happen.");
 }
示例#17
0
 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));
 }
示例#18
0
 public Player(IDoubleServerClient serverClient, byte id, byte color)
 {
     ServerClient = serverClient;
     Id           = id;
     Color        = color;
 }
示例#19
0
 public void OnLostConnection(IDoubleServerClient client, DoubleServer.ClientState state)
 {
     Console.WriteLine($"Server lost connection to client ({state})");
 }