private static async void AcceptAEClientAsync(TcpClient rawClient) { Console.WriteLine("Accepting AEClient"); var client = new AERoutingClient(rawClient, MasterRouterServices.PacketHandler, MasterRouterServices.IncomingMiddlewareHandler, MasterRouterServices.OutgoingMiddlewareHandler, MasterRouterServices.ObjectRepository); try { await client.ListenForDataTask(); } catch (Exception ex) { Console.WriteLine($"Unhandled exception in {nameof(AcceptAEClientAsync)}: {ex}"); } finally { if (client.ClientGuid != Guid.Empty) { MasterRouterServices.ObjectRepository.RemoveObject(client.ClientGuid); MasterRouterServices.RemoteClients.RemoveClient(client.ClientGuid); } } client.Disconnect(); }
public static async Task ServerHandshakeResultHandler(ServerHandshakeResultPacket packet, AERoutingClient context) { Console.WriteLine("Received AE# handshake result"); if (packet.Result == ServerHandshakeResultPacket.SHRPResult.Failure) { Console.WriteLine($"Failed to authenticate with master router (reason: generic failure)"); context.Disconnect(); return; } if (packet.Result == ServerHandshakeResultPacket.SHRPResult.Success) { // Authenticated context.ComponentData = packet.OurComponent; foreach (var component in packet.OtherAvailableComponents) { context.ObjectRepository.AddObject(component); } context.Authenticated = true; Console.WriteLine($"Authenticated successfully, we have guid: {context.ClientGuid}"); context.ObjectRepository.AddObject(context.ComponentData); } }
public static async Task HandleClientHandshakeBegin(ClientHandshakeBeginPacket packet, AERoutingClient context) { //await HandshakeHandlers.ClientHandshakeBeginHandler( packet, context ); if (!HandshakeHandlers.ValidateHandshakeProtocol(packet)) { Console.WriteLine( $"Invalid protocol (got: {packet.Protocol}) (exp: {Constants.LatestAEProtocolVersion})"); context.Disconnect(); return; } if (!HandshakeHandlers.ValidateHandshakeAuthentication(packet)) { Console.WriteLine( $"Authentication failure (got: {packet.Password}) (exp: {Constants._TEMP_RouterAuthPassword})"); context.Disconnect(); return; } context.Authenticated = true; context.ComponentData = packet.Component; context.ComponentData.Guid = Guid.NewGuid(); Console.WriteLine($"Successfully authenticated {context.ComponentData.Guid}"); var clients = MasterRouterServices.RemoteClients.GetClients( item => SendToOtherComponentsPredicate(context, item)); var snoap = new ServerObjectAvailabilityChanged { RoutingObject = context.ComponentData, Available = true }; await context.SendPayloadToComponents(clients, snoap.PacketId, snoap.FinalizePacket().Payload); }
/// <summary> /// Default handler called when a ClientHandshakeBegin packet is received /// </summary> /// <param name="packet">Packet received</param> /// <param name="context">Context object</param> /// <returns>Task</returns> public static async Task ClientHandshakeBeginHandler(ClientHandshakeBeginPacket packet, AERoutingClient context) { Console.WriteLine("Received AE# handshake"); if (!ValidateHandshakeProtocol(packet)) { throw new InvalidPacketException( $"Received handshake with protocol version {packet.Protocol} but version {Constants.LatestAEProtocolVersion} is required"); } var response = new ServerHandshakeResultPacket(); if (!ValidateHandshakeAuthentication(packet)) { Console.WriteLine( $"Password does not match (expected: {Constants._TEMP_RouterAuthPassword}) (got: {packet.Password})"); response.Result = ServerHandshakeResultPacket.SHRPResult.Failure; await context.SendDataAsync(response.FinalizePacket()); context.Disconnect(); return; } context.Authenticated = true; context.ComponentData = packet.Component; // Overwrite any existing guid - master router should dictate this context.ComponentData.Guid = Guid.NewGuid(); Console.WriteLine($"Password matched, allocating guid: {context.ComponentData.Guid}"); Console.WriteLine($"Got component of type {context.ComponentData.Type}"); Console.WriteLine($"Component owns {context.ComponentData.OwnedObjects.Count} objects"); response.Result = ServerHandshakeResultPacket.SHRPResult.Success; response.OurComponent = context.ComponentData; response.OtherAvailableComponents = context.ObjectRepository.GetAllObjects(); context.ObjectRepository.AddObject(context.ComponentData); await context.SendDataAsync(response.FinalizePacket()); }