Exemple #1
0
        void UpdateClient()
        {
            if (ServerConnectionClient == null)
            {
                return;
            }

            if (ReceivePacket(ref ServerConnectionClient.SenderEndPoint, out NetPacket Packet))
            {
                Packet.SetIsValid(ServerConnectionClient.OnPacketReceived(Timestamp(), Packet));

                if (Packet.IsValid())
                {
                    Packet.Sender = ServerConnectionClient;

                    switch (ServerConnectionClient.State)
                    {
                    case ClientState.Connecting:
                        if (Packet.Type == PacketType.ConnectionAccept)
                        {
                            ServerConnectionClient.State = ClientState.Connected;
                            OnClientConnected?.Invoke(ServerConnectionClient);
                            break;
                        }

                        break;

                    case ClientState.Connected:
                        if (Packet.Type == PacketType.ConnectionAccept)
                        {
                            break;
                        }

                        if (Packet.Type == PacketType.Disconnect)
                        {
                            Disconnect(ServerConnectionClient);
                            break;
                        }

                        OnPacketReceived?.Invoke(Packet);
                        break;

                    case ClientState.Disconnected:
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }
                else
                {
                    DebugPrint("Dropping invalid packet 2");
                }

                FreePacket(Packet);
            }

            if (ServerConnectionClient.State == ClientState.Connecting)
            {
                // If last packet sent was more than half a second ago, try again
                if (LastSendTime(ServerConnectionClient) > 500)
                {
                    NetPacket P = AllocPacket();
                    P.PacketNum = 0;
                    P.Payload   = new byte[0];
                    P.Type      = PacketType.ConnectionRequest;
                    SendPacket(P, ServerConnectionClient);
                    FreePacket(P);
                }
            }
            else if (ServerConnectionClient.State == ClientState.Connected)
            {
                ServerConnectionClient.HandleQueuedPackets(this);
            }
        }
Exemple #2
0
        void UpdateServer()
        {
            IPEndPoint Sender = null;

            if (ReceivePacket(ref Sender, out NetPacket Packet))
            {
                NetWreckClient Cli = FindOrCreateClient(Sender);
                Packet.SetIsValid(Cli.OnPacketReceived(Timestamp(), Packet));

                if (Packet.IsValid())
                {
                    Packet.Sender = Cli;

                    switch (Cli.State)
                    {
                    case ClientState.Connecting: {
                        if (OnClientConnecting != null)
                        {
                            OnClientConnecting(Cli, Packet);
                        }
                        else
                        {
                            AcceptConnection(Cli);
                        }
                        break;
                    }

                    case ClientState.Connected: {
                        if (Packet.Type == PacketType.ConnectionRequest)
                        {
                            AcceptConnection(Cli);
                            break;
                        }

                        OnPacketReceived?.Invoke(Packet);
                        break;
                    }

                    case ClientState.Disconnected: {
                        Disconnect(Cli);
                        break;
                    }

                    default:
                        throw new NotImplementedException();
                    }
                }
                else
                {
                    DebugPrint("Dropping invalid packet 2");
                }

                FreePacket(Packet);
            }

            NetWreckClient[] Clients = ServerClientList.ToArray();
            foreach (var C in Clients)
            {
                double LastReceived = LastReceiveTime(C);

                if (LastReceived > 10000)
                {
                    ServerClientList.Remove(C);
                }
                else if (LastReceived > 2000)
                {
                    Disconnect(C);
                }
                else
                {
                    C.HandleQueuedPackets(this);
                }
            }
        }