Quellcode durchsuchen

修复tcp数据包解析问题

master
SmallChi(Koike) vor 4 Jahren
Ursprung
Commit
728a8ea344
4 geänderte Dateien mit 54 neuen und 32 gelöschten Zeilen
  1. +2
    -1
      src/JT1078.Gateway.Tests/JT1078.Gateway.Test/PipeTest.cs
  2. +1
    -1
      src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Unix.config
  3. +1
    -1
      src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Win32NT.config
  4. +50
    -29
      src/JT1078.Gateway/JT1078TcpServer.cs

+ 2
- 1
src/JT1078.Gateway.Tests/JT1078.Gateway.Test/PipeTest.cs Datei anzeigen

@@ -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()


+ 1
- 1
src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Unix.config Datei anzeigen

@@ -29,7 +29,7 @@
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="all"/>
<logger name="*" minlevel="Error" writeTo="all"/>
<logger name="JT1078.Gateway.TestNormalHosting.Services.JT1078FlvNormalMsgHostedService" minlevel="Trace" writeTo="JT1078FlvNormalMsgHostedService"/>
<logger name="JT1078.Gateway.JT1078TcpServer" minlevel="Trace" writeTo="JT1078TcpServer"/>
<logger name="JT1078Logging" minlevel="Trace" writeTo="JT1078Logging"/>


+ 1
- 1
src/JT1078.Gateway.Tests/JT1078.Gateway.TestNormalHosting/Configs/nlog.Win32NT.config Datei anzeigen

@@ -37,7 +37,7 @@
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="all,console"/>
<logger name="*" minlevel="Error" writeTo="all,console"/>
<logger name="JT1078.Gateway.JT1078TcpServer" minlevel="Trace" writeTo="JT1078TcpServer,console"/>
<logger name="JT1078Logging" minlevel="Trace" writeTo="JT1078Logging,console"/>
</rules>

+ 50
- 29
src/JT1078.Gateway/JT1078TcpServer.cs Datei anzeigen

@@ -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;

/// <summary>
/// 使用正常方式
/// </summary>
@@ -204,11 +207,13 @@ namespace JT1078.Gateway
}
private void ReaderBuffer(ref ReadOnlySequence<byte> buffer, FixedHeaderInfo fixedHeaderInfo, JT1078TcpSession session, out SequencePosition consumed, out SequencePosition examined)
{
consumed = buffer.Start;
examined = buffer.End;
SequenceReader<byte> seqReader = new SequenceReader<byte>(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<byte>(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<byte>(seqReader.Sequence.Slice(fixedHeaderInfo.TotalSize));
fixedHeaderInfo.Reset();
seqReader = new SequenceReader<byte>(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; }


Laden…
Abbrechen
Speichern