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