From 728a8ea34406ddb84e95fe1c47c52f49b9245a11 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Wed, 16 Sep 2020 18:14:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtcp=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8C=85=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JT1078.Gateway.Test/PipeTest.cs | 3 +- .../Configs/nlog.Unix.config | 2 +- .../Configs/nlog.Win32NT.config | 2 +- src/JT1078.Gateway/JT1078TcpServer.cs | 79 ++++++++++++------- 4 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/JT1078.Gateway.Tests/JT1078.Gateway.Test/PipeTest.cs b/src/JT1078.Gateway.Tests/JT1078.Gateway.Test/PipeTest.cs index 2aa24b8..83fcbdf 100644 --- a/src/JT1078.Gateway.Tests/JT1078.Gateway.Test/PipeTest.cs +++ b/src/JT1078.Gateway.Tests/JT1078.Gateway.Test/PipeTest.cs @@ -12,6 +12,7 @@ using JT1078.Protocol.Enums; using System.Linq; using System.Text; using System.IO; +using System.Runtime.InteropServices; namespace JT1078.Gateway.Test { @@ -355,7 +356,7 @@ namespace JT1078.Gateway.Test if (seqReader.End) break; } - } + } [Fact] public void Test2() diff --git a/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Unix.config b/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Unix.config index 333e593..b8da728 100644 --- a/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Unix.config +++ b/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Unix.config @@ -29,7 +29,7 @@ - + diff --git a/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Win32NT.config b/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Win32NT.config index 07098c1..147db79 100644 --- a/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Win32NT.config +++ b/src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Win32NT.config @@ -37,7 +37,7 @@ - + diff --git a/src/JT1078.Gateway/JT1078TcpServer.cs b/src/JT1078.Gateway/JT1078TcpServer.cs index 2997c87..f520424 100644 --- a/src/JT1078.Gateway/JT1078TcpServer.cs +++ b/src/JT1078.Gateway/JT1078TcpServer.cs @@ -6,6 +6,7 @@ using System.IO.Pipelines; using System.Linq; using System.Net; using System.Net.Sockets; +using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -40,6 +41,8 @@ namespace JT1078.Gateway private readonly JT1078UseType jT1078UseType; + private long Counter = 0; + /// /// 使用正常方式 /// @@ -204,11 +207,13 @@ namespace JT1078.Gateway } private void ReaderBuffer(ref ReadOnlySequence buffer, FixedHeaderInfo fixedHeaderInfo, JT1078TcpSession session, out SequencePosition consumed, out SequencePosition examined) { + consumed = buffer.Start; + examined = buffer.End; SequenceReader seqReader = new SequenceReader(buffer); long totalConsumed = 0; while (!seqReader.End) { - if (seqReader.Remaining < 30) + if (seqReader.Length < 30) { fixedHeaderInfo.Reset(); break; @@ -216,39 +221,24 @@ namespace JT1078.Gateway if (!fixedHeaderInfo.FoundHeader) { var header = seqReader.Sequence.Slice(0, 4); - var headerValue = BinaryPrimitives.ReadUInt32BigEndian(header.FirstSpan); + uint headerValue = BinaryPrimitives.ReadUInt32BigEndian(header.ToArray()); if (JT1078Package.FH == headerValue) { //sim - fixedHeaderInfo.SIM = ReadBCD(seqReader.Sequence.Slice(8, 6).FirstSpan, 12); if (string.IsNullOrEmpty(fixedHeaderInfo.SIM)) { - fixedHeaderInfo.SIM = session.SessionID; + fixedHeaderInfo.SIM = ReadBCD(seqReader.Sequence.Slice(8, 6).ToArray(), 12); + fixedHeaderInfo.SIM = fixedHeaderInfo.SIM ?? session.SessionID; } //根据数据类型处理对应的数据长度 fixedHeaderInfo.TotalSize += 15; var dataType = seqReader.Sequence.Slice(fixedHeaderInfo.TotalSize, 1).FirstSpan[0]; fixedHeaderInfo.TotalSize += 1; - JT1078Label3 label3 = new JT1078Label3(dataType); - int bodyLength = 0; - //透传的时候没有该字段 - if (label3.DataType != JT1078DataType.透传数据) - { - //时间戳 - bodyLength += 8; - } - //非视频帧时没有该字段 - if (label3.DataType == JT1078DataType.视频I帧 || - label3.DataType == JT1078DataType.视频P帧 || - label3.DataType == JT1078DataType.视频B帧) - { - //上一个关键帧 + 上一帧 = 2 + 2 - bodyLength += 4; - } + int bodyLength = GetRealDataBodyLength(dataType); fixedHeaderInfo.TotalSize += bodyLength; - var bodyLengthFirstSpan = seqReader.Sequence.Slice(fixedHeaderInfo.TotalSize, 2).FirstSpan; - //数据体长度 + var bodyLengthFirstSpan = seqReader.Sequence.Slice(fixedHeaderInfo.TotalSize, 2).ToArray(); fixedHeaderInfo.TotalSize += 2; + //数据体长度 bodyLength = BinaryPrimitives.ReadUInt16BigEndian(bodyLengthFirstSpan); if (bodyLength < 0) { @@ -257,8 +247,8 @@ namespace JT1078.Gateway } if (bodyLength == 0)//数据体长度为0 { - seqReader.Advance(fixedHeaderInfo.TotalSize); var package1 = seqReader.Sequence.Slice(0, fixedHeaderInfo.TotalSize).ToArray(); + seqReader.Advance(fixedHeaderInfo.TotalSize); if (LogLogger.IsEnabled(LogLevel.Trace)) { LogLogger.LogTrace($"{package1.ToHexString()}"); @@ -283,7 +273,11 @@ namespace JT1078.Gateway finally { totalConsumed += seqReader.Consumed; + seqReader = new SequenceReader(seqReader.Sequence.Slice(fixedHeaderInfo.TotalSize)); fixedHeaderInfo.Reset(); +#if DEBUG + Interlocked.Increment(ref Counter); +#endif } continue; } @@ -297,12 +291,12 @@ namespace JT1078.Gateway throw new ArgumentException("not JT1078 package."); } } - if ((seqReader.Remaining - fixedHeaderInfo.TotalSize) < 0) break; - seqReader.Advance(fixedHeaderInfo.TotalSize); + if ((seqReader.Length - fixedHeaderInfo.TotalSize) < 0) break; var package = seqReader.Sequence.Slice(0, fixedHeaderInfo.TotalSize).ToArray(); + seqReader.Advance(fixedHeaderInfo.TotalSize); if (LogLogger.IsEnabled(LogLevel.Trace)) { - LogLogger.LogTrace($"{package.ToHexString()}"); + LogLogger.LogTrace($"===>{package.ToHexString()}"); } try { @@ -324,9 +318,18 @@ namespace JT1078.Gateway finally { totalConsumed += seqReader.Consumed; + seqReader = new SequenceReader(seqReader.Sequence.Slice(fixedHeaderInfo.TotalSize)); fixedHeaderInfo.Reset(); - seqReader = new SequenceReader(seqReader.Sequence.Slice(seqReader.Consumed)); +#if DEBUG + Interlocked.Increment(ref Counter); +#endif + } +#if DEBUG + if (Logger.IsEnabled(LogLevel.Trace)) + { + Logger.LogTrace($"======>{Counter}"); } +#endif } if (seqReader.End) { @@ -335,7 +338,6 @@ namespace JT1078.Gateway else { consumed = buffer.GetPosition(totalConsumed); - examined = buffer.End; } } public Task StopAsync(CancellationToken cancellationToken) @@ -367,7 +369,26 @@ namespace JT1078.Gateway } return bcdSb.ToString().TrimStart('0'); } - + int GetRealDataBodyLength(byte dataType) + { + JT1078Label3 label3 = new JT1078Label3(dataType); + int bodyLength = 0; + //透传的时候没有该字段 + if (label3.DataType != JT1078DataType.透传数据) + { + //时间戳 + bodyLength += 8; + } + //非视频帧时没有该字段 + if (label3.DataType == JT1078DataType.视频I帧 || + label3.DataType == JT1078DataType.视频P帧 || + label3.DataType == JT1078DataType.视频B帧) + { + //上一个关键帧 + 上一帧 = 2 + 2 + bodyLength += 4; + } + return bodyLength; + } class FixedHeaderInfo { public bool FoundHeader { get; set; }