예제 #1
0
 internal SecureClient(TlsNetworkTransport tlsNetworkTransport, ILoggerFactory loggerFactory, ISerializer serializer, IOrderingService orderingService,
                       CancellationToken cancellationToken, ISendIdempotencyService <Guid, Packet> sendIdempotencyService,
                       IReceiveIdempotencyService <string> receiveIdempotencyService, ISequenceGenerator delaySequenceGenerator,
                       int millisecondsIntervalForPacketResend, int keepAliveTimeOut,
                       int maximumNumberOfKeepAliveMisses, int keepAliveResponseTimeOut)
 {
     Init(loggerFactory, serializer, orderingService, cancellationToken,
          sendIdempotencyService, receiveIdempotencyService, delaySequenceGenerator,
          millisecondsIntervalForPacketResend, tlsNetworkTransport, keepAliveTimeOut,
          maximumNumberOfKeepAliveMisses, keepAliveResponseTimeOut);
 }
예제 #2
0
        private async Task ProcessClient(TcpClient client)
        {
            logger?.LogInformation("{0} connected", client.Client.RemoteEndPoint);

            SslStream sslStream = new SslStream(client.GetStream(), false, ValidateClientCertificate);

            try
            {
                await sslStream.AuthenticateAsServerAsync(serverCertificate, clientCertificateRequired, sslProtocols, true);
            }
            catch (Exception e)
            {
                logger?.LogError(e, "AuthenticateAsServerAsync threw exeception");
                sslStream.Close();
                client.Close();
                return;
            }

            TlsNetworkTransport tlsNetworkTransport = new TlsNetworkTransport(cancellationToken, client, loggerFactory, sslStream);

            switch (PerformHandshake(client, tlsNetworkTransport, out string clientId))
            {
            case HandshakeResults.NewClientConnected:
                SecureClient secureClient = new SecureClient(tlsNetworkTransport, loggerFactory, serializer, orderingService,
                                                             cancellationToken, sendIdempotencyService, receiveIdempotencyService, delaySequenceGenerator, millisecondsIntervalForPacketResend, keepAliveTimeOut,
                                                             maximumNumberOfKeepAliveMisses, keepAliveResponseTimeOut);
                clients.TryAdd(clientId, secureClient);
                await tlsNetworkTransport.SendData(Encoding.Unicode.GetBytes(Id));

                OnClientConnected?.Invoke(secureClient);
                break;

            case HandshakeResults.ExsistingClientReconnected:
                clients[clientId].ClientReconnected(tlsNetworkTransport);
                await tlsNetworkTransport.SendData(Encoding.Unicode.GetBytes(Id));

                break;

            case HandshakeResults.HandshakeFailed:
                tlsNetworkTransport.DropConnection();
                client.Close();
                client.Dispose();
                break;
            }
        }