Beispiel #1
0
        public void ConnectToServer(IPEndPoint Server)
        {
            DebugPrint("Starting connection to server");

            ServerConnectionClient       = new NetWreckClient(Server);
            ServerConnectionClient.State = ClientState.Connecting;
        }
Beispiel #2
0
        public void SendPacket(NetPacket Packet, NetWreckClient Cli)
        {
            byte[] Arr = ByteArrayPool.Rent(MaxDataSize);
            Cli.OnPacketSent(Timestamp(), Packet);

            int Len = WreckUtils.Serialize(Packet, Arr, MaxDataSize);

            SendRaw(Arr, Len, Cli);
            ByteArrayPool.Return(Arr);
        }
Beispiel #3
0
        public void RejectConnection(NetWreckClient Cli)
        {
            NetPacket P = AllocPacket();

            P.PacketNum = 0;
            P.Payload   = new byte[0];
            P.Type      = PacketType.ConnectionReject;
            SendPacket(P, Cli);
            FreePacket(P);
        }
Beispiel #4
0
        NetWreckClient FindOrCreateClient(IPEndPoint EndPoint)
        {
            foreach (var C in ServerClientList)
            {
                if (C.SenderEndPoint.Equals(EndPoint))
                {
                    return(C);
                }
            }

            NetWreckClient Cli = new NetWreckClient(EndPoint);

            Cli.State = ClientState.Connecting;
            ServerClientList.Add(Cli);
            return(Cli);
        }
Beispiel #5
0
        public void Disconnect(NetWreckClient Cli)
        {
            NetPacket P = AllocPacket();

            P.PacketNum = 0;
            P.Payload   = new byte[0];
            P.Type      = PacketType.Disconnect;
            SendPacket(P, Cli);
            FreePacket(P);

            if (Cli.State != ClientState.Disconnected)
            {
                Cli.State = ClientState.Disconnected;
                OnClientDisconnected?.Invoke(Cli);
            }
        }
Beispiel #6
0
 public void SendRaw(byte[] Data, int Length, NetWreckClient Cli)
 {
     SendRaw(Data, Length, Cli.SenderEndPoint);
 }
Beispiel #7
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);
                }
            }
        }
Beispiel #8
0
 public double LastReceiveTime(NetWreckClient Cli)
 {
     return(Timestamp() - Cli.TimeReceived);
 }
Beispiel #9
0
 public double LastSendTime(NetWreckClient Cli)
 {
     return(Timestamp() - Cli.TimeSent);
 }