public override async Task OnConnectedAsync(ConnectionContext connection)
        {
            var serializer = new MqttPacketSerializer();

            using (var adapter = new MqttConnectionContext(serializer, connection))
            {
                var args = new MqttServerAdapterClientAcceptedEventArgs(adapter);
                ClientAccepted?.Invoke(this, args);

                await args.SessionTask;
            }
        }
        public Task AcceptWebSocketAsync(WebSocket webSocket)
        {
            if (webSocket == null)
            {
                throw new ArgumentNullException(nameof(webSocket));
            }

            var channel       = new MqttWebSocketServerChannel(webSocket);
            var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerCommunicationAdapter(channel);

            var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);

            ClientAccepted?.Invoke(this, eventArgs);
            return(eventArgs.SessionTask);
        }
Ejemplo n.º 3
0
        public Task AcceptWebSocketAsync(WebSocket webSocket)
        {
            if (webSocket == null)
            {
                throw new ArgumentNullException(nameof(webSocket));
            }

            var channel       = new MqttWebSocketServerChannel(webSocket);
            var clientAdapter = new MqttChannelAdapter(channel, new MqttPacketSerializer(), new MqttNetLogger());

            var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);

            ClientAccepted?.Invoke(this, eventArgs);
            return(eventArgs.SessionTask);
        }
Ejemplo n.º 4
0
        public async Task RunWebSocketConnectionAsync(WebSocket webSocket, string endpoint)
        {
            if (webSocket == null)
            {
                throw new ArgumentNullException(nameof(webSocket));
            }

            var clientAdapter = new MqttChannelAdapter(new MqttWebSocketChannel(webSocket, endpoint), new MqttPacketSerializer(), new MqttNetLogger().CreateChildLogger(nameof(MqttWebSocketServerAdapter)));

            var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);

            ClientAccepted?.Invoke(this, eventArgs);

            if (eventArgs.SessionTask != null)
            {
                await eventArgs.SessionTask.ConfigureAwait(false);
            }
        }
Ejemplo n.º 5
0
        public override async Task OnConnectedAsync(ConnectionContext connection)
        {
            // required for websocket transport to work
            var transferFormatFeature = connection.Features.Get <ITransferFormatFeature>();

            if (transferFormatFeature != null)
            {
                transferFormatFeature.ActiveFormat = TransferFormat.Binary;
            }


            var serializer = new MqttPacketSerializer();

            using (var adapter = new MqttConnectionContext(serializer, connection))
            {
                var args = new MqttServerAdapterClientAcceptedEventArgs(adapter);
                ClientAccepted?.Invoke(this, args);

                await args.SessionTask;
            }
        }
Ejemplo n.º 6
0
 private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs eventArgs)
 {
     eventArgs.SessionTask = _clientSessionsManager.StartSession(eventArgs.Client);
 }
Ejemplo n.º 7
0
 private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs e)
 {
     ClientAccepted?.Invoke(this, e);
 }
Ejemplo n.º 8
0
 private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs eventArgs)
 {
     eventArgs.SessionTask = Task.Run(
         () => _clientSessionsManager.RunSessionAsync(eventArgs.Client, _cancellationTokenSource.Token),
         _cancellationTokenSource.Token);
 }
Ejemplo n.º 9
0
 private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs eventArgs)
 {
     eventArgs.SessionTask = Task.Run(
         async() => await _clientSessionsManager.RunClientSessionAsync(eventArgs.Client, _cancellationTokenSource.Token).ConfigureAwait(false),
         _cancellationTokenSource.Token);
 }
Ejemplo n.º 10
0
        private async Task TryHandleClientConnectionAsync(Socket clientSocket)
        {
            var socketIndex = Interlocked.Increment(ref latestSocketIndex);

            string    clientPrefix  = null;
            string    serverEndPont = null;
            SslStream sslStream     = null;
            var       stopwatch     = new Stopwatch();

            try
            {
                stopwatch.Start();

                clientPrefix  = $"Socket[{socketIndex}, {clientSocket.RemoteEndPoint}]";
                serverEndPont = string.Format("{0}, {1}, {2}",
                                              _socket.LocalEndPoint,
                                              _addressFamily == AddressFamily.InterNetwork ? "ipv4" : "ipv6",
                                              _tlsCertificate == null ? "tcp" : "tls");

                _logger.Verbose($"{clientPrefix} > Accepted by TCP listener '{serverEndPont}'. Time:{stopwatch.Elapsed.TotalMilliseconds}ms");

                clientSocket.NoDelay = true;

                if (_tlsCertificate != null)
                {//如果不设置超时,AuthenticateAsServerAsync 可能会一直阻塞下去
                    clientSocket.ReceiveTimeout = (int)_communicationTimeout.TotalMilliseconds;
                    clientSocket.SendTimeout    = (int)_communicationTimeout.TotalMilliseconds;

                    var stream = new NetworkStream(clientSocket, true);
                    sslStream = new SslStream(stream, false);

                    var cancellationTokenDisposeSslStream = new CancellationTokenSource();
                    var taskDisposeSslStream = Task.Delay(_communicationTimeout, cancellationTokenDisposeSslStream.Token)
                                               .ContinueWith((task) =>
                    {
                        if (task.IsCanceled)
                        {
                            return;
                        }
                        if (cancellationTokenDisposeSslStream.IsCancellationRequested)
                        {
                            return;
                        }

                        //超时,则清理掉
                        Cleanup(clientSocket, sslStream);
                    });

                    await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, _tlsOptions.SslProtocol, false).ConfigureAwait(false);

                    cancellationTokenDisposeSslStream.Cancel();

                    _logger.Verbose($"{clientPrefix} > SslStream created. Time:{stopwatch.Elapsed.TotalMilliseconds}ms");
                }

                _logger.Verbose($"{clientPrefix} > Processed. Time:{stopwatch.Elapsed.TotalMilliseconds}ms");

                if (ClientAccepted != null)
                {
                    using (var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketSerializer(), _logger))
                    {
                        var args = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);
                        ClientAccepted.Invoke(this, args);
                        await args.SessionTask.ConfigureAwait(false);
                    }
                }
            }
            catch (ObjectDisposedException exception)
            {
                // It can happen that the listener socket is accessed after the cancellation token is already set and the listener socket is disposed.
                _logger.Error(exception, $"{clientPrefix} > Error while handling client connection. Listener:'{serverEndPont}' Time:{stopwatch.Elapsed.TotalMilliseconds}ms Disposed");
            }
            catch (Exception exception)
            {
                Cleanup(clientSocket, sslStream);

                if (exception is SocketException s && s.SocketErrorCode == SocketError.OperationAborted)
                {
                    _logger.Error(exception, $"{clientPrefix} > Error while handling client connection. Listener:'{serverEndPont}' Time:{stopwatch.Elapsed.TotalMilliseconds}ms OperationAborted");
                    return;
                }
                if (exception is System.IO.IOException ioException)
                {
                    _logger.Error(exception, $"{clientPrefix} > Error while handling client connection. Listener:'{serverEndPont}' Time:{stopwatch.Elapsed.TotalMilliseconds}ms IOException");
                    return;
                }

                _logger.Error(exception, $"{clientPrefix} > Error while handling client connection. Listener:'{serverEndPont}' Time:{stopwatch.Elapsed.TotalMilliseconds}ms Unknown");
            }
            finally
            {
                try
                {
                    Cleanup(clientSocket, sslStream);

                    _logger.Verbose($"{clientPrefix} > Disconnected at TCP listener '{serverEndPont}'. Time:{stopwatch.Elapsed.TotalMilliseconds}ms");
                }
                catch (Exception disposeException)
                {
                    _logger.Error(disposeException, $"{clientPrefix} > Error while cleaning up client connection. Listener:'{serverEndPont}' Time:{stopwatch.Elapsed.TotalMilliseconds}ms");
                }

                stopwatch.Stop();
            }
        }