diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..afdb1f3b
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,4 @@
+[*.cs]
+
+# CA1416: 验证平台兼容性
+dotnet_diagnostic.CA1416.severity = none
diff --git a/cmonitor.libs/cmonitor.libs.csproj b/cmonitor.libs/cmonitor.libs.csproj
index 1dce156b..94859a76 100644
--- a/cmonitor.libs/cmonitor.libs.csproj
+++ b/cmonitor.libs/cmonitor.libs.csproj
@@ -2,10 +2,11 @@
Library
- net7;net8
+ net8
false
true
Debug;Release;ReleaseNetwork;ReleaseMonitor
+ true
DEBUG;TRACE
@@ -27,15 +28,6 @@
none
false
-
- embedded
-
-
- embedded
-
-
- embedded
-
embedded
@@ -45,9 +37,7 @@
embedded
-
- embedded
-
+
embedded
diff --git a/cmonitor.llock.win/cmonitor.llock.win.csproj b/cmonitor.llock.win/cmonitor.llock.win.csproj
index f03fe184..46eb340b 100644
--- a/cmonitor.llock.win/cmonitor.llock.win.csproj
+++ b/cmonitor.llock.win/cmonitor.llock.win.csproj
@@ -2,7 +2,7 @@
WinExe
- net7.0-windows;net8.0-windows
+ net8.0-windows
disable
true
enable
diff --git a/cmonitor.message.win/cmonitor.message.win.csproj b/cmonitor.message.win/cmonitor.message.win.csproj
index cd0fd566..ad7c00fd 100644
--- a/cmonitor.message.win/cmonitor.message.win.csproj
+++ b/cmonitor.message.win/cmonitor.message.win.csproj
@@ -2,7 +2,7 @@
WinExe
- net7.0-windows;net8.0-windows
+ net8.0-windows
disable
true
enable
@@ -11,26 +11,10 @@
Debug;Release;ReleaseNetwork;ReleaseMonitor
-
- embedded
-
-
embedded
-
- embedded
-
-
-
- embedded
-
-
-
- embedded
-
-
embedded
diff --git a/cmonitor.network.service/cmonitor.network.service.csproj b/cmonitor.network.service/cmonitor.network.service.csproj
index e3392cf7..4726f094 100644
--- a/cmonitor.network.service/cmonitor.network.service.csproj
+++ b/cmonitor.network.service/cmonitor.network.service.csproj
@@ -2,7 +2,7 @@
Exe
- net7.0;net8.0
+ net8.0
enable
disable
true
diff --git a/cmonitor.notify.win/cmonitor.notify.win.csproj b/cmonitor.notify.win/cmonitor.notify.win.csproj
index d16d2372..cc7ef8ac 100644
--- a/cmonitor.notify.win/cmonitor.notify.win.csproj
+++ b/cmonitor.notify.win/cmonitor.notify.win.csproj
@@ -2,7 +2,7 @@
WinExe
- net7.0-windows;net8.0-windows
+ net8.0-windows
disable
true
enable
@@ -11,26 +11,10 @@
Debug;Release;ReleaseNetwork;ReleaseMonitor
-
- embedded
-
-
embedded
-
- embedded
-
-
-
- embedded
-
-
-
- embedded
-
-
embedded
diff --git a/cmonitor.sas.service/cmonitor.sas.service.csproj b/cmonitor.sas.service/cmonitor.sas.service.csproj
index c9a82788..6381eb5f 100644
--- a/cmonitor.sas.service/cmonitor.sas.service.csproj
+++ b/cmonitor.sas.service/cmonitor.sas.service.csproj
@@ -2,7 +2,7 @@
Exe
- net7.0;net8.0
+ net8.0
enable
disable
true
diff --git a/cmonitor.sln b/cmonitor.sln
index 85774f35..2e92fb75 100644
--- a/cmonitor.sln
+++ b/cmonitor.sln
@@ -29,6 +29,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.tests", "cmonitor.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.network.service", "cmonitor.network.service\cmonitor.network.service.csproj", "{E8AB5039-3A42-424F-AAEC-A102C8CAA305}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D2831E12-7497-4B7B-ADFD-7C327C5622D3}"
+ ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
diff --git a/cmonitor.snatch.win/cmonitor.snatch.win.csproj b/cmonitor.snatch.win/cmonitor.snatch.win.csproj
index e885d0a6..35713a8a 100644
--- a/cmonitor.snatch.win/cmonitor.snatch.win.csproj
+++ b/cmonitor.snatch.win/cmonitor.snatch.win.csproj
@@ -2,7 +2,7 @@
WinExe
- net7.0-windows;net8.0-windows
+ net8.0-windows
disable
true
enable
@@ -11,25 +11,10 @@
app.manifest
-
- embedded
-
-
embedded
-
- embedded
-
-
-
- embedded
-
-
-
- embedded
-
embedded
diff --git a/cmonitor.viewer.server.win/cmonitor.viewer.server.win.csproj b/cmonitor.viewer.server.win/cmonitor.viewer.server.win.csproj
index 141f579f..1d7129fe 100644
--- a/cmonitor.viewer.server.win/cmonitor.viewer.server.win.csproj
+++ b/cmonitor.viewer.server.win/cmonitor.viewer.server.win.csproj
@@ -2,7 +2,7 @@
WinExe
- net7.0-windows;net8.0-windows
+ net8.0-windows
win-x64;win-arm64
disable
true
@@ -12,25 +12,10 @@
Debug;Release;ReleaseNetwork;ReleaseMonitor
-
- embedded
-
-
embedded
-
- embedded
-
-
-
- embedded
-
-
-
- embedded
-
embedded
diff --git a/cmonitor.wallpaper.win/cmonitor.wallpaper.win.csproj b/cmonitor.wallpaper.win/cmonitor.wallpaper.win.csproj
index d086e722..48542b5d 100644
--- a/cmonitor.wallpaper.win/cmonitor.wallpaper.win.csproj
+++ b/cmonitor.wallpaper.win/cmonitor.wallpaper.win.csproj
@@ -2,7 +2,7 @@
WinExe
- net7.0-windows;net8.0-windows
+ net8.0-windows
disable
true
enable
@@ -11,25 +11,10 @@
Debug;Release;ReleaseNetwork;ReleaseMonitor
-
- embedded
-
-
embedded
-
- embedded
-
-
-
- embedded
-
-
-
- embedded
-
embedded
diff --git a/cmonitor/client/tunnel/ITunnelConnection.cs b/cmonitor/client/tunnel/ITunnelConnection.cs
index b0265145..7db02976 100644
--- a/cmonitor/client/tunnel/ITunnelConnection.cs
+++ b/cmonitor/client/tunnel/ITunnelConnection.cs
@@ -3,7 +3,9 @@ using common.libs.extends;
using System.Buffers;
using System.IO.Pipelines;
using System.Net;
+using System.Net.Quic;
using System.Net.Security;
+using System.Net.Sockets;
using System.Text.Json.Serialization;
namespace cmonitor.client.tunnel
@@ -270,4 +272,217 @@ namespace cmonitor.client.tunnel
}
}
+
+ public sealed class TunnelConnectionQuic : ITunnelConnection
+ {
+ public TunnelConnectionQuic()
+ {
+ }
+
+ public string RemoteMachineName { get; init; }
+ public string TransactionId { get; init; }
+ public string TransportName { get; init; }
+ public string Label { get; init; }
+ public TunnelMode Mode { get; init; }
+ public TunnelProtocolType ProtocolType { get; init; }
+ public TunnelType Type { get; init; }
+ public TunnelDirection Direction { get; init; }
+ public IPEndPoint IPEndPoint { get; init; }
+
+ public bool Connected => Stream != null && Stream.CanWrite;
+
+ [JsonIgnore]
+ public QuicStream Stream { get; init; }
+
+
+ private ITunnelConnectionReceiveCallback callback;
+ private CancellationTokenSource cancellationTokenSource;
+ private object userToken;
+ private bool framing;
+ private Pipe pipe;
+ private ReceiveDataBuffer bufferCache = new ReceiveDataBuffer();
+
+ ///
+ /// 开始接收数据
+ ///
+ /// 数据回调
+ /// 自定义数据
+ /// 是否处理粘包,true时,请在首部4字节标注数据长度
+ public void BeginReceive(ITunnelConnectionReceiveCallback callback, object userToken, bool framing = true)
+ {
+ if (this.callback != null) return;
+
+ this.callback = callback;
+ this.userToken = userToken;
+ this.framing = framing;
+
+ cancellationTokenSource = new CancellationTokenSource();
+ pipe = new Pipe(new PipeOptions(pauseWriterThreshold: 1 * 1024 * 1024, resumeWriterThreshold: 128 * 1024));
+ _ = ProcessWrite();
+ _ = ProcessReader();
+
+ }
+ private async Task ProcessWrite()
+ {
+ PipeWriter writer = pipe.Writer;
+ try
+ {
+ while (cancellationTokenSource.IsCancellationRequested == false)
+ {
+ Memory buffer = writer.GetMemory(8 * 1024);
+ int length = await Stream.ReadAsync(buffer, cancellationTokenSource.Token);
+ if (length == 0)
+ {
+ break;
+ }
+ writer.Advance(length);
+ FlushResult result = await writer.FlushAsync();
+ if (result.IsCanceled || result.IsCompleted)
+ {
+ break;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ {
+ Logger.Instance.Error(ex);
+ }
+ }
+ finally
+ {
+ await writer.CompleteAsync();
+ Close();
+ }
+ }
+ private async Task ProcessReader()
+ {
+ PipeReader reader = pipe.Reader;
+ try
+ {
+ while (cancellationTokenSource.IsCancellationRequested == false)
+ {
+ ReadResult readResult = await reader.ReadAsync();
+ ReadOnlySequence buffer = readResult.Buffer;
+ if (buffer.IsEmpty && readResult.IsCompleted)
+ {
+ break;
+ }
+ if (buffer.Length > 0)
+ {
+ SequencePosition end = await ReadPacket(buffer).ConfigureAwait(false);
+ reader.AdvanceTo(end);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ {
+ Logger.Instance.Error(ex);
+ }
+ }
+ finally
+ {
+ await reader.CompleteAsync();
+ Close();
+ }
+ }
+ private unsafe int ReaderHead(ReadOnlySequence buffer)
+ {
+ Span span = stackalloc byte[4];
+ buffer.Slice(0, 4).CopyTo(span);
+ return span.ToInt32();
+ }
+ private async Task ReadPacket(ReadOnlySequence buffer)
+ {
+ //不分包
+ if (framing == false)
+ {
+ foreach (var memory in buffer)
+ {
+ try
+ {
+ await callback.Receive(this, memory, this.userToken).ConfigureAwait(false);
+ }
+ catch (Exception)
+ {
+ }
+ }
+ return buffer.End;
+ }
+
+ //分包
+ while (buffer.Length > 4)
+ {
+ //读取头
+ int length = ReaderHead(buffer);
+ if (buffer.Length < length + 4)
+ {
+ break;
+ }
+
+ //拼接数据
+ ReadOnlySequence cache = buffer.Slice(4, length);
+ foreach (var memory in cache)
+ {
+ bufferCache.AddRange(memory);
+ }
+
+ try
+ {
+ await callback.Receive(this, bufferCache.Data.Slice(0, bufferCache.Size), this.userToken).ConfigureAwait(false);
+ }
+ catch (Exception)
+ {
+ }
+ bufferCache.Clear();
+
+ //分割去掉已使用的数据
+ buffer = buffer.Slice(4 + length);
+ }
+ return buffer.Start;
+ }
+
+
+ private SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1);
+ public async Task SendAsync(ReadOnlyMemory data)
+ {
+ await semaphoreSlim.WaitAsync();
+ try
+ {
+ await Stream.WriteAsync(data, cancellationTokenSource.Token);
+ await Stream.FlushAsync();
+ }
+ catch (Exception ex)
+ {
+ if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ {
+ Logger.Instance.Error(ex);
+ }
+ }
+ finally
+ {
+ semaphoreSlim.Release();
+ }
+ }
+
+ public void Close()
+ {
+ callback = null;
+ userToken = null;
+ cancellationTokenSource?.Cancel();
+ pipe = null;
+ bufferCache.Clear(true);
+
+ Stream?.Close();
+ Stream?.Dispose();
+ }
+
+ public override string ToString()
+ {
+ return $"TransactionId:{TransactionId},TransportName:{TransportName},ProtocolType:{ProtocolType},Type:{Type},Direction:{Direction},IPEndPoint:{IPEndPoint},RemoteMachineName:{RemoteMachineName}";
+ }
+ }
}
diff --git a/cmonitor/cmonitor.csproj b/cmonitor/cmonitor.csproj
index 4be9f920..47e93afb 100644
--- a/cmonitor/cmonitor.csproj
+++ b/cmonitor/cmonitor.csproj
@@ -2,7 +2,7 @@
Exe
- net8.0;net7.0
+ net8.0
enable
disable
true
@@ -15,6 +15,7 @@
true
true
cmonitor.snk
+ true
@@ -107,6 +108,9 @@
Always
+
+
+
@@ -121,7 +125,7 @@
-
+
diff --git a/cmonitor/plugins/tunnel/server/TunnelBindServer.cs b/cmonitor/plugins/tunnel/server/TunnelBindServer.cs
index de8d56fb..a64acb1a 100644
--- a/cmonitor/plugins/tunnel/server/TunnelBindServer.cs
+++ b/cmonitor/plugins/tunnel/server/TunnelBindServer.cs
@@ -3,13 +3,14 @@ using common.libs.extends;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Sockets;
+using System.Text;
namespace cmonitor.plugins.tunnel.server
{
public sealed class TunnelBindServer
{
- public Func