public async Task <RPCResponseMessage> InvokeMethodAsync(RPCRequestMessage messageRq, CancellationToken cancellationToken) { if (!_shouldBeConnected) { await ConnectAsync().ConfigureAwait(false); } if (_connectionCancellationToken.IsCancellationRequested) { return(null); } var handler = new RpcMessageHandler(); while (!_messageResponsesHandlers.TryAdd(messageRq.MessageId, handler)) { await Task.Delay(1).ConfigureAwait(false); } if (_currentIndex > ResetIndex) { _currentIndex = -1; } bool sent; RpcClient client; using (var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_connectionCancellationToken, cancellationToken)) { do { client = _clients[Interlocked.Increment(ref _currentIndex) % _socketsPerClient]; sent = await client.SendRpcMessageAsync(messageRq).ConfigureAwait(false); if (!sent) { try { await client.DisconnectAsync(); await client.ConnectAsync(); } catch (Exception ex) { Core.Log.Write(ex); } } } while (!sent); await handler.Event.WaitAsync(InvokeMethodTimeout, linkedTokenSource.Token).ConfigureAwait(false); } if (handler.Event.IsSet) { return(handler.Message); } _connectionCancellationToken.ThrowIfCancellationRequested(); if (cancellationToken.IsCancellationRequested) { await client.SendRpcMessageAsync(new RPCCancelMessage { MessageId = messageRq.MessageId }).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); } throw new TimeoutException("Timeout of {0} seconds has been reached waiting the response from the server with Id={1}.".ApplyFormat(InvokeMethodTimeout / 1000, messageRq.MessageId)); }
/// <summary> /// Start KMS Server /// </summary> /// <param name="logger">Any Logger method that implements ILogger.</param> /// <param name="settings">KMS Server Settings Object</param> public static void Start(ILogger logger, KMSServerSettings settings = null) { // Prevent Running Twice if (_listener != null && _listener.Running) { //throw new Exception("Cannot run two instances of KMS Server."); _listener.Stop(); } // Initialize Logger if No Logger was Set if (logger == null) { logger = new StringLogger(); } // Initialize KMS Server Settings to use with RPC Message Handler if (settings != null) { Settings = settings; } else { Settings = new KMSServerSettings(); } RpcMessageHandler messageHandler = new RpcMessageHandler(Settings, new KMSRequestHandler(Settings, logger)); // Kill Any Processes using the desired TCP/IP Port if (settings != null && settings.KillProcessOnPort) { foreach (TcpRow tcpRow in ManagedIpHelper.GetExtendedTcpTable(true)) { if (tcpRow.LocalEndPoint.Port == Settings.Port) { Process.GetProcessById(tcpRow.ProcessId).Kill(); Thread.Sleep(5000); break; } } } // Configure and Start KMS Server _listener = new TCPServer(messageHandler, logger); _listener.Start(Settings.Port); // Log KMS Server TCP Server Startup if (_listener.Running) { logger.LogMessage("KMS Port: " + Settings.Port); logger.LogMessage("KMS HWID: " + Settings.DefaultKMSHWID); logger.LogMessage("KMS Activation Interval: " + Settings.VLActivationInterval); logger.LogMessage("KMS Renewal Interval: " + Settings.VLRenewalInterval); logger.LogMessage("KMS Port Process Termination: " + Settings.KillProcessOnPort); logger.LogMessage(""); logger.LogMessage("KMS Server Emulator started successfully."); logger.LogMessage(""); } }
/// <summary> /// Create a new Instance of TCPServer /// </summary> /// <param name="messageHandler">RPC Message Handler to handle and format request and response messages</param> /// <param name="logger">Log handler that implements ILogger</param> public TCPServer(RpcMessageHandler messageHandler, ILogger logger) { _messageHandler = messageHandler; _logger = logger; }