Пример #1
0
        async Task PipeB2A(CancellationToken cancellationToken)
        {
            //using (var received = SmartBuffer.Rent(_bufferSize))
            var received = SmartBuffer.Rent(_bufferSize);

            while (!cancellationToken.IsCancellationRequested)
            {
                received.SignificantLength = await ClientB.ReadAsync(received.Memory, cancellationToken);

                _logger.LogInformation($"Received {received.SignificantLength} bytes from [{ClientB.EndPoint.ToString()}].");

                if (0 >= received.SignificantLength)
                {
                    ReportBroken(PipeBrokenCause.Exception);
                    return;
                }
                if (_filtersB.Count > 0)
                {
                    var result = ExecuteFilter_AfterReading(ClientB, received, _filtersB, cancellationToken);
                    received.Dispose();
                    received = result.Buffer;
                    if (!result.Continue)
                    {
                        _logger.LogInformation($"Pipe broke by filterB [{ClientB.EndPoint.ToString()}].");
                        received?.Dispose();
                        ReportBroken(PipeBrokenCause.FilterBreak);
                        return;
                    }
                }
                if (_filtersA.Count > 0)
                {
                    var result = ExecuteFilter_BeforeWriting(ClientA, received, _filtersA, cancellationToken);
                    received.Dispose();
                    received = result.Buffer;
                    if (!result.Continue)
                    {
                        _logger.LogInformation($"Pipe broke by filterA [{ClientA.EndPoint.ToString()}].");
                        received?.Dispose();
                        ReportBroken(PipeBrokenCause.FilterBreak);
                        return;
                    }
                }
                if (null != received && received.SignificantLength > 0)
                {
                    _logger?.LogInformation($"{received.SignificantLength} bytes left after filtering.");
                    int written = await ClientA.WriteAsync(received.SignificanMemory, cancellationToken);

                    _logger?.LogInformation($"Pipe [{ClientB.EndPoint.ToString()}] => [{ClientA.EndPoint.ToString()}] {written} bytes.");

                    if (0 >= written)
                    {
                        received?.Dispose();
                        ReportBroken(PipeBrokenCause.Exception);
                        return;
                    }
                    ReportPiping(new PipingEventArgs {
                        Bytes = written, Origin = ClientB.EndPoint, Destination = ClientA.EndPoint
                    });
                }
                //continue piping
            }//end while
            received?.Dispose();
            ReportBroken(PipeBrokenCause.Cancelled);
        }
Пример #2
0
        async Task PipeB2A(CancellationToken cancellationToken)
        {
            SmartBuffer buffer = SmartBuffer.Rent(_bufferSize);//read buff

            buffer.SignificantLength = await ClientB.ReadAsync(buffer.Memory, cancellationToken);


            if (buffer.SignificantLength > 0)
            {
                if (_filtersB.Count > 0)
                {
                    bool locked = false;
                    try
                    {
                        DoFilter_Lock(ref locked);

                        PipeFilterResult filterResult = DoFilter_AfterReading(ref buffer, _filtersB, cancellationToken);
                        if (!filterResult.Continue || cancellationToken.IsCancellationRequested)
                        {
                            ReportBroken();
                            return;
                        }
                        else
                        {
                            buffer = filterResult.Buffer;
                        }

                        DoFilter_UnLock(ref locked);
                    }
                    finally
                    {
                        DoFilter_UnLock(ref locked);
                    }
                }//end FilterB
                if (_filtersA.Count > 0)
                {
                    bool locked = false;
                    try
                    {
                        DoFilter_Lock(ref locked);

                        PipeFilterResult filterResult = DoFilter_BeforeWriting(ref buffer, _filtersA, cancellationToken);
                        if (!filterResult.Continue || cancellationToken.IsCancellationRequested)
                        {
                            ReportBroken();
                            return;
                        }
                        else
                        {
                            buffer = filterResult.Buffer;
                        }

                        DoFilter_UnLock(ref locked);
                    }
                    finally
                    {
                        DoFilter_UnLock(ref locked);
                    }
                }//end FilterA

                int written = await ClientA.WriteAsync(buffer.Memory, cancellationToken);//Pipe

                _logger?.LogInformation($"DefaultPipe Pipe B to A {written} bytes.");
                if (written < 0)
                {
                    ClientA.Close();
                    buffer.Dispose();
                    ReportBroken();
                    return;
                }
            }
            else if (0 == buffer.SignificantLength)
            {
                _logger?.LogInformation($"DefaultPipe read = 0.");
            }
            else//<0
            {
                _logger?.LogInformation($"DefaultPipe error, read={buffer.SignificantLength}.");
                ClientB.Close();
                ReportBroken();
                return;
            }


            buffer.Dispose();//free memory.

            if (!cancellationToken.IsCancellationRequested)
            {
                await PipeB2A(cancellationToken);//continue.
            }
        }