public void ConnectToServer(IPEndPoint Server) { DebugPrint("Starting connection to server"); ServerConnectionClient = new NetWreckClient(Server); ServerConnectionClient.State = ClientState.Connecting; }
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); }
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); }
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); }
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); } }
public void SendRaw(byte[] Data, int Length, NetWreckClient Cli) { SendRaw(Data, Length, Cli.SenderEndPoint); }
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); } } }
public double LastReceiveTime(NetWreckClient Cli) { return(Timestamp() - Cli.TimeReceived); }
public double LastSendTime(NetWreckClient Cli) { return(Timestamp() - Cli.TimeSent); }