0 votes
by (270 points)

   public ServerCommunication(PaymentServerConfiguration configuration,
                           ServiceConfig serviceConfig,
                           HandlerFactory handlerFactory,
                           ICertificateManager certificateManager)
{
    Rebex.Licensing.Keys.Add("");
    _configuration = configuration;
    this.serviceConfig = serviceConfig;
    _handlerFactory = handlerFactory;
    CertificateManager = certificateManager;
    Task.Run(StartServer);
}

private async Task StartServer()
{

    var certificate = CertificateManager.GetTlsCertificate();
    var listener = new Socket(SocketType.Stream, ProtocolType.Tcp);
    listener.Bind(_configuration.IpEndpoint);
    listener.Listen(524);

    while (true)
    {
        var plainSocket = await listener.AcceptAsync();
        var socket = new TlsServerSocket(plainSocket);
        socket.Parameters.Certificate = CertificateChain.BuildFrom(certificate);
        await socket.NegotiateAsync();
        Task.Run(() => HandleClientAsync(socket));
    }
}

private async Task HandleClientAsync(TlsServerSocket tcpClient)
{
    var socket = tcpClient.Socket;
    string? terminalId = null;
    LogConnection(socket);

    while (true)
    {
        try
        {
            terminalId ??= GetTerminalIdFromSocket(tcpClient);
            var client = TryGetClient(tcpClient, terminalId);

            if (!IsSocketAlive(socket))
            {
                DisposeConnection(terminalId);
                break;
            }


            var dataBytes = await PullData(tcpClient);

            if (dataBytes.Count() == 0)
            {
                _logger.Error($"Available bytes were >0, but we received no bytes.");
                continue;
            }

            await ProcessMessage(client, dataBytes, terminalId);
        }
        catch (Exception ex)
        {
            _logger.Error($"Received unexpected error: {ex.Message} \n{ex.StackTrace}");
        }
    }

    LogDisconect(socket);
    UnregisterExtender(terminalId);
}
public void UnregisterExtender(string terminalId)
{
    if (terminalId == null)
    {
        return;
    }

    if (!_connections.ContainsKey(terminalId))
    {
        return;
    }

    _connections.Remove(terminalId);
    _logger.Info($"Terminal '{terminalId}' connection has been dropped.");
}
Applies to: Rebex TLS

1 Answer

0 votes
by (150k points)

while (true)
{
    var plainSocket = await listener.AcceptAsync();
    var socket = new TlsServerSocket(plainSocket);
    socket.Parameters.Certificate = CertificateChain.BuildFrom(certificate);
    await socket.NegotiateAsync();
    Task.Run(() => HandleClientAsync(socket));
}

while (true)
{
    var plainSocket = await listener.AcceptAsync();
    Task.Run(() => HandleClientAsync(plainSocket));
}

...