private void OnKeepAlive() { var msgServerPing = new ServerPingMessage() { ServerTimestamp = TimeSpan.FromTicks(DateTime.UtcNow.Ticks) }; this.SendFrameToClient(FrameType.ServerPing, msgServerPing.Serialize()); if (this.state.LastKeepAliveUtc + this.clientTimeout < DateTime.UtcNow) { this.Self.Tell(PoisonPill.Instance); this.log.Error($"[{this.Self.Path.Name}] timed out"); return; } }
/// <summary>Processes the UDP transfer frame.</summary> /// <param name="frame">The frame.</param> private void ProcessUdpTransferFrame(UdpTransferFrame frame) { switch (frame.Type) { case FrameType.ServerAuthenticationRequest: var msgAuthenticationRequest = new ServerAuthenticationRequest(frame.MessageBuffer); ProcessAuthenticationRequest(msgAuthenticationRequest, this.signingKeyBase64); break; case FrameType.ServerHello: SubscribeToDefaultArea(); if (OnConnected != null) { Thread connected = new Thread(() => OnConnected()); connected.Start(); } break; case FrameType.ServerPing: var msgServerPing = new ServerPingMessage(frame.MessageBuffer); var now = TimeSpan.FromTicks(DateTime.UtcNow.Ticks); var cmdClientPong = new ClientPongMessage() { ServerRequestTimestamp = msgServerPing.ServerTimestamp, ClientRequestTimestamp = now, ClientResponseTimestamp = now }; ReliableMessaging.OnSendFrame(new UdpTransferFrame(FrameType.ClientPong, cmdClientPong.Serialize())); break; case FrameType.Message: LastMessageReceived = DateTime.Now; ReliableMessaging.ProcessMessageFrame(frame); break; default: throw new NotImplementedException(frame.Type.ToString()); } }