Пример #1
0
        private async Task StartSendDeliveryTaskAsync()
        {
            while (true)
            {
                var dataToSend = await _deliveryPublisherSubscriber.DequeueAsync(_deliveryBuffer);

                if (dataToSend.Length == 0)
                {
                    Console.WriteLine("Leaving Send Delivery Task async");
                    return;
                }

                try
                {
                    var dt = DateTime.UtcNow;
                    await SocketStream.WriteAsync(dataToSend);

                    SocketStatistic.WeHaveSendEvent(dataToSend.Length);
                    SocketStatistic.LastSendToSocketDuration = DateTime.UtcNow - dt;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    Log.InvokeExceptionLog(this, e, true);
                    Disconnect();
                    break;
                }
            }
        }
Пример #2
0
        private async Task PublishDataToTrafficReaderAsync(TcpDataReader trafficReader)
        {
            try
            {
#if NETSTANDARD2_1
                var buffer = await trafficReader.AllocateBufferToWriteAsync(_cancellationToken.Token);

                var readSize =
                    await SocketStream.ReadAsync(buffer, _cancellationToken.Token);


                while (readSize > 0)
                {
                    SocketStatistic.WeHaveReceiveEvent(readSize);

                    trafficReader.CommitWrittenData(readSize);

                    buffer = await trafficReader.AllocateBufferToWriteAsync(_cancellationToken.Token);

                    readSize =
                        await SocketStream.ReadAsync(buffer, _cancellationToken.Token);
                }
#else
                var buffer = await trafficReader.AllocateBufferToWriteLegacyAsync(_cancellationToken.Token);

                var readSize =
                    await SocketStream.ReadAsync(buffer.buffer, buffer.start, buffer.len, _cancellationToken.Token);

                while (readSize > 0)
                {
                    SocketStatistic.WeHaveReceiveEvent(readSize);

                    trafficReader.CommitWrittenData(readSize);

                    buffer = await trafficReader.AllocateBufferToWriteLegacyAsync(_cancellationToken.Token);

                    readSize =
                        await SocketStream.ReadAsync(buffer.buffer, buffer.start, buffer.len, _cancellationToken.Token);
                }
#endif
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }
            finally
            {
                Log.InvokeInfoLog(this, "Disconnected from Traffic Reader Loop");
                trafficReader.Stop();
            }
        }
Пример #3
0
 internal ValueTask StartAsync(TcpClient tcpClient, ITcpSerializer <TSocketData> tcpSerializer, object lockObject, ISocketLogInvoker log,
                               Action <ITcpContext> disconnectedCallback, byte[] deliveryBuffer)
 {
     Log = log;
     _disconnectedCallback        = disconnectedCallback;
     _lockObject                  = lockObject;
     _deliveryBuffer              = deliveryBuffer;
     _deliveryPublisherSubscriber = new TcpSocketPublisherSubscriber(_lockObject);
     TcpClient     = tcpClient;
     SocketStream  = TcpClient.GetStream();
     TcpSerializer = tcpSerializer;
     SetContextName(TcpClient.Client.RemoteEndPoint.ToString());
     Connected       = true;
     SocketStatistic = new SocketStatistic();
     return(OnConnectAsync());
 }
Пример #4
0
        public void Disconnect()
        {
            if (_disconnectedCallback != null)
            {
                try
                {
                    _disconnectedCallback(this);
                }
                catch (Exception e)
                {
                    Log.InvokeExceptionLog(this, e, true);
                }
            }

            lock (_lockObject)
            {
                if (!Connected)
                {
                    return;
                }

                Connected = false;
            }
            Log.InvokeInfoLog(this, $"Socket {ContextName} is Disconnected with Ip:{TcpClient.Client.RemoteEndPoint}. Id=" + Id);

            try
            {
                _cancellationToken.Cancel(true);
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                SocketStatistic.WeHaveDisconnect();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                SocketStream.Close();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                TcpClient.Close();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                _deliveryPublisherSubscriber.Stop();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }


            Task.Run(ProcessOnDisconnectAsync);
        }