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.");
}