This commit is contained in:
snltty
2024-12-20 17:18:32 +08:00
parent 0b53cb5d16
commit f2cefe4d73
16 changed files with 337 additions and 25 deletions

View File

@@ -0,0 +1,268 @@
using linker.libs;
using linker.libs.extends;
using linker.messenger.relay.messenger;
using linker.messenger.relay.server;
using linker.messenger.relay.server.caching;
using linker.messenger.relay.server.validator;
using linker.messenger.signin;
using linker.messenger.tunnel;
using linker.plugins.tunnel;
using linker.tunnel.transport;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
namespace linker.messenger.example
{
internal class Program
{
public static PublicConfigInfo publicConfigInfo = new PublicConfigInfo();
static ISerializer serializer;
static IMessengerSender messengerSender;
static IMessengerResolver messengerResolver;
static void Main(string[] args)
{
//序列化
serializer = new Serializer();
//信标发送和接受
messengerSender = new MessengerSender();
messengerResolver = new MessengerResolver(messengerSender);
messengerResolver.Initialize(publicConfigInfo.Certificate);
}
static SignCaching signCaching;
static SignInArgsTransfer signInArgsTransfer;
static ISignInStore signInStore;
static TunnelExternalResolver tunnelExternalResolver;
static TunnelMessengerAdapter tunnelMessengerAdapter;
static void Server()
{
//登录相关
signInArgsTransfer = new SignInArgsTransfer();
//signInArgsTransfer.LoadArgs(new List<ISignInArgs>());
signInStore = new SignInStore();
signCaching = new SignCaching(signInStore, signInArgsTransfer);
SignInServerMessenger signInServerMessenger = new SignInServerMessenger(messengerSender, signCaching, serializer);
//打洞相关
tunnelExternalResolver = new TunnelExternalResolver();
TunnelServerMessenger tunnelServerMessenger = new TunnelServerMessenger(messengerSender, signCaching, serializer);
//中继相关
IRelayServerMasterStore relayServerMasterStore = new RelayServerMasterStore();
IRelayServerNodeStore relayServerNodeStore = new RelayServerNodeStore();
RelayServerNodeTransfer relayServerNodeTransfer = new RelayServerNodeTransfer(serializer, relayServerNodeStore, relayServerMasterStore);
RelayServerResolver relayServerResolver = new RelayServerResolver(relayServerNodeTransfer, serializer);
IRelayServerCaching relayServerCaching = new RelayServerCachingMemory(serializer);
RelayServerMasterTransfer relayServerMasterTransfer = new RelayServerMasterTransfer(relayServerCaching, serializer, relayServerMasterStore);
RelayServerReportResolver relayServerReportResolver = new RelayServerReportResolver(relayServerMasterTransfer);
//自定义中继验证
RelayServerValidatorTransfer relayServerValidatorTransfer = new RelayServerValidatorTransfer();
//relayServerValidatorTransfer.LoadValidators(new List<IRelayServerValidator> { });
RelayServerMessenger relayServerMessenger = new RelayServerMessenger(messengerSender, signCaching, serializer, relayServerMasterTransfer, relayServerValidatorTransfer);
//加载这些信标处理器
messengerResolver.LoadMessenger(new List<IMessenger>
{
signInServerMessenger,
tunnelServerMessenger,
relayServerMessenger
});
//TCP
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, publicConfigInfo.Port));
socket.Listen(int.MaxValue);
TimerHelper.Async(async () =>
{
while (true)
{
var client = await socket.AcceptAsync();
TimerHelper.Async(async () =>
{
var bytes = new byte[1024];
int length = await client.ReceiveAsync(bytes.AsMemory(0, 1));
//信标
if (bytes[0] == 0)
{
await messengerResolver.BeginReceiveServer(socket, Helper.EmptyArray);
}
//外网端口
else if (bytes[0] == 1)
{
await tunnelExternalResolver.Resolve(client, Helper.EmptyArray);
}
//中继节点报告
else if (bytes[0] == 2)
{
await relayServerReportResolver.Resolve(client, Helper.EmptyArray);
}
//中继
else if (bytes[0] == 3)
{
await relayServerResolver.Resolve(client, Helper.EmptyArray);
}
});
}
});
//UDP
Socket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socketUdp.Bind(new IPEndPoint(IPAddress.Any, publicConfigInfo.Port));
socketUdp.WindowsUdpBug();
TimerHelper.Async(async () =>
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
byte[] buffer = new byte[1 * 1024 * 1024];
while (true)
{
try
{
SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false);
IPEndPoint ep = result.RemoteEndPoint as IPEndPoint;
try
{
await tunnelExternalResolver.Resolve(socketUdp, ep, buffer.AsMemory(0, result.ReceivedBytes));
}
catch (Exception)
{
}
}
catch (Exception)
{
break;
}
}
});
}
}
public sealed class PublicConfigInfo
{
public string MachineId { get; set; }
public IConnection SignConnection { get; set; }
public IPAddress[] LocalIps { get; set; }
public int RouteLevel { get; set; }
public X509Certificate2 Certificate { get; set; }
public List<TunnelTransportItemInfo> TunnelTransports { get; set; }
public int Port { get; set; } = 12345;
}
/// <summary>
/// 中继节点信息存储库
/// </summary>
public sealed class RelayServerNodeStore : IRelayServerNodeStore
{
public byte Flag => 2;
public int ServicePort => Program.publicConfigInfo.Port;
public RelayServerNodeInfo Node => new RelayServerNodeInfo { };
public void Confirm()
{
}
public void SetMaxGbTotalLastBytes(ulong value)
{
}
public void SetMaxGbTotalMonth(int month)
{
}
}
/// <summary>
/// 中继主机信息存储库
/// </summary>
public sealed class RelayServerMasterStore : IRelayServerMasterStore
{
public RelayServerMasterInfo Master => new RelayServerMasterInfo { SecretKey = "snltty" };
}
/// <summary>
/// 自定义打洞的存储库
/// </summary>
public sealed class TunnelMessengerAdapterStore : ITunnelMessengerAdapterStore
{
public IConnection SignConnection => Program.publicConfigInfo.SignConnection;
public NetworkInfo Network => new NetworkInfo { MachineId = Program.publicConfigInfo.MachineId, LocalIps = Program.publicConfigInfo.LocalIps, RouteLevel = Program.publicConfigInfo.RouteLevel };
public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate;
public List<TunnelTransportItemInfo> TunnelTransports => Program.publicConfigInfo.TunnelTransports;
public TunnelMessengerAdapterStore()
{
}
public bool SetTunnelTransports(List<TunnelTransportItemInfo> list)
{
return true;
}
}
/// <summary>
/// 自定义序列化
/// </summary>
public sealed class Serializer : ISerializer
{
public T Deserialize<T>(ReadOnlySpan<byte> buffer)
{
return buffer.GetString().DeJson<T>();
}
public byte[] Serialize<T>(T value)
{
return value.ToJson().ToBytes();
}
}
/// <summary>
/// 自定义登录持久化存储
/// </summary>
public sealed class SignInStore : ISignInStore
{
public void Confirm()
{
}
public bool Delete(string id)
{
return true;
}
public SignCacheInfo Find(string id)
{
return null;
}
public IEnumerable<SignCacheInfo> Find()
{
return new List<SignCacheInfo>();
}
public string Insert(SignCacheInfo value)
{
return string.Empty;
}
public string NewId()
{
return Guid.NewGuid().ToString();
}
public bool Update(SignCacheInfo value)
{
return true;
}
}
}

View File

@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
<ProjectReference Include="..\linker.signin\linker.messenger.signin.csproj" />
</ItemGroup>
</Project>

View File

@@ -71,6 +71,8 @@ namespace linker.messenger.relay.client
IRelayClientTransport transport = Transports.FirstOrDefault(c => c.Type == relayClientStore.RelayType && relayClientStore.Disabled == false); IRelayClientTransport transport = Transports.FirstOrDefault(c => c.Type == relayClientStore.RelayType && relayClientStore.Disabled == false);
if (transport == null) if (transport == null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay to {remoteMachineId} fail,transport not found {relayClientStore.RelayType},{relayClientStore.Disabled}");
return null; return null;
} }

View File

@@ -13,7 +13,7 @@ using linker.messenger.relay.server;
namespace linker.messenger.relay.client.transport namespace linker.messenger.relay.client.transport
{ {
public sealed class RelayClientTransportSelfHost : IRelayClientTransport public class RelayClientTransportSelfHost : IRelayClientTransport
{ {
public string Name => "Linker"; public string Name => "Linker";
public RelayClientType Type => RelayClientType.Linker; public RelayClientType Type => RelayClientType.Linker;

View File

@@ -46,7 +46,7 @@ namespace linker.messenger.relay.messenger
private readonly RelayServerValidatorTransfer relayValidatorTransfer; private readonly RelayServerValidatorTransfer relayValidatorTransfer;
private readonly ISerializer serializer; private readonly ISerializer serializer;
public RelayServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer, ISerializer serializer) public RelayServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, ISerializer serializer, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer)
{ {
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.signCaching = signCaching; this.signCaching = signCaching;

View File

@@ -1,6 +1,5 @@
using linker.libs; using linker.libs;
using linker.libs.extends; using linker.libs.extends;
using linker.messenger.relay.server.caching;
using System.Buffers; using System.Buffers;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
@@ -19,13 +18,11 @@ namespace linker.messenger.relay.server
RelaySpeedLimit limitTotal = new RelaySpeedLimit(); RelaySpeedLimit limitTotal = new RelaySpeedLimit();
private readonly ISerializer serializer; private readonly ISerializer serializer;
private readonly IRelayServerCaching relayCaching;
private readonly IRelayServerNodeStore relayServerNodeStore; private readonly IRelayServerNodeStore relayServerNodeStore;
private readonly IRelayServerMasterStore relayServerMasterStore; private readonly IRelayServerMasterStore relayServerMasterStore;
public RelayServerNodeTransfer(ISerializer serializer, IRelayServerCaching relayCaching, IRelayServerNodeStore relayServerNodeStore, IRelayServerMasterStore relayServerMasterStore) public RelayServerNodeTransfer(ISerializer serializer, IRelayServerNodeStore relayServerNodeStore, IRelayServerMasterStore relayServerMasterStore)
{ {
this.serializer = serializer; this.serializer = serializer;
this.relayCaching = relayCaching;
this.relayServerNodeStore = relayServerNodeStore; this.relayServerNodeStore = relayServerNodeStore;
this.relayServerMasterStore = relayServerMasterStore; this.relayServerMasterStore = relayServerMasterStore;

View File

@@ -97,7 +97,6 @@ namespace linker.plugins.tunnel
transportUdpPortMap, transportUdpPortMap,
new TransportUdp(), new TransportUdp(),
}); });
} }
private NetworkInfo GetLocalConfig() private NetworkInfo GetLocalConfig()

View File

@@ -12,6 +12,7 @@ namespace linker.messenger
public interface IMessengerResolver public interface IMessengerResolver
{ {
public void Initialize(string certificate, string password); public void Initialize(string certificate, string password);
public void Initialize(X509Certificate2 certificate);
public Task<IConnection> BeginReceiveClient(Socket socket); public Task<IConnection> BeginReceiveClient(Socket socket);
public Task<IConnection> BeginReceiveClient(Socket socket, bool sendFlag, byte flag); public Task<IConnection> BeginReceiveClient(Socket socket, bool sendFlag, byte flag);
public void LoadMessenger(List<IMessenger> list); public void LoadMessenger(List<IMessenger> list);
@@ -31,7 +32,7 @@ namespace linker.messenger
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private X509Certificate serverCertificate; private X509Certificate2 serverCertificate;
public MessengerResolver(IMessengerSender messengerSender) public MessengerResolver(IMessengerSender messengerSender)
{ {
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
@@ -42,7 +43,7 @@ namespace linker.messenger
string path = Path.GetFullPath(certificate); string path = Path.GetFullPath(certificate);
if (File.Exists(path)) if (File.Exists(path))
{ {
serverCertificate = new X509Certificate(path, password); serverCertificate = new X509Certificate2(path, password, X509KeyStorageFlags.Exportable);
} }
else else
{ {
@@ -50,6 +51,10 @@ namespace linker.messenger
Environment.Exit(0); Environment.Exit(0);
} }
} }
public void Initialize(X509Certificate2 certificate)
{
serverCertificate = certificate;
}
public virtual void AddReceive(ushort id, ulong bytes) { } public virtual void AddReceive(ushort id, ulong bytes) { }
public virtual void AddSendt(ushort id, ulong bytes) { } public virtual void AddSendt(ushort id, ulong bytes) { }

View File

@@ -1,6 +1,5 @@
using linker.libs; using linker.libs;
using linker.libs.extends; using linker.libs.extends;
using linker.messenger;
namespace linker.messenger.signin namespace linker.messenger.signin
{ {
@@ -10,7 +9,7 @@ namespace linker.messenger.signin
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly ISerializer serializer; private readonly ISerializer serializer;
public SignInServerMessenger(SignCaching signCaching, IMessengerSender messengerSender, ISerializer serializer) public SignInServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, ISerializer serializer)
{ {
this.signCaching = signCaching; this.signCaching = signCaching;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;

View File

@@ -19,7 +19,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.signin", "
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.tunnel", "linker.messenger.tunnel\linker.messenger.tunnel.csproj", "{92582A55-8BBF-4B82-892D-75CEC8969EAF}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.tunnel", "linker.messenger.tunnel\linker.messenger.tunnel.csproj", "{92582A55-8BBF-4B82-892D-75CEC8969EAF}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "linker.messenger.relay", "linker.messenger.relay\linker.messenger.relay.csproj", "{90E99334-FBF6-423F-A636-89B1E71D8FEE}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.relay", "linker.messenger.relay\linker.messenger.relay.csproj", "{90E99334-FBF6-423F-A636-89B1E71D8FEE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "linker.messenger.example", "linker.messenger.example\linker.messenger.example.csproj", "{98970DF9-0996-4111-97BA-DD495A098498}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -139,6 +141,18 @@ Global
{90E99334-FBF6-423F-A636-89B1E71D8FEE}.Release|x64.Build.0 = Release|Any CPU {90E99334-FBF6-423F-A636-89B1E71D8FEE}.Release|x64.Build.0 = Release|Any CPU
{90E99334-FBF6-423F-A636-89B1E71D8FEE}.Release|x86.ActiveCfg = Release|Any CPU {90E99334-FBF6-423F-A636-89B1E71D8FEE}.Release|x86.ActiveCfg = Release|Any CPU
{90E99334-FBF6-423F-A636-89B1E71D8FEE}.Release|x86.Build.0 = Release|Any CPU {90E99334-FBF6-423F-A636-89B1E71D8FEE}.Release|x86.Build.0 = Release|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Debug|Any CPU.Build.0 = Debug|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Debug|x64.ActiveCfg = Debug|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Debug|x64.Build.0 = Debug|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Debug|x86.ActiveCfg = Debug|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Debug|x86.Build.0 = Debug|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Release|Any CPU.ActiveCfg = Release|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Release|Any CPU.Build.0 = Release|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Release|x64.ActiveCfg = Release|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Release|x64.Build.0 = Release|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Release|x86.ActiveCfg = Release|Any CPU
{98970DF9-0996-4111-97BA-DD495A098498}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -30,7 +30,7 @@ namespace linker.plugins.relay
public void AddClient(ServiceCollection serviceCollection, FileConfig config) public void AddClient(ServiceCollection serviceCollection, FileConfig config)
{ {
serviceCollection.AddSingleton<RelayClientTransportSelfHost>(); serviceCollection.AddSingleton<PlusRelayClientTransportSelfHost>();
serviceCollection.AddSingleton<RelayClientTransfer>(); serviceCollection.AddSingleton<RelayClientTransfer>();

View File

@@ -1,4 +1,5 @@
using linker.messenger; using linker.libs;
using linker.messenger;
using linker.messenger.relay.client; using linker.messenger.relay.client;
using linker.messenger.relay.client.transport; using linker.messenger.relay.client.transport;
using linker.plugins.client; using linker.plugins.client;
@@ -7,7 +8,11 @@ using System.Security.Cryptography.X509Certificates;
namespace linker.plugins.relay.client namespace linker.plugins.relay.client
{ {
public class PlusRelayClientStore : IRelayClientStore public sealed class PlusRelayClientTransportSelfHost : RelayClientTransportSelfHost
{
public PlusRelayClientTransportSelfHost(IMessengerSender messengerSender,ISerializer serializer, IRelayClientStore relayClientStore) :base(messengerSender, serializer, relayClientStore) { }
}
public sealed class PlusRelayClientStore : IRelayClientStore
{ {
public byte Flag => (byte)(ResolverType.Relay); public byte Flag => (byte)(ResolverType.Relay);

View File

@@ -1,6 +1,4 @@
using linker.messenger.relay.server; using linker.messenger.relay.server;
using linker.plugins.resolver;
using linker.plugins.server;
namespace linker.plugins.relay.server namespace linker.plugins.relay.server
{ {

View File

@@ -1,32 +1,36 @@
using linker.tunnel.transport; using linker.tunnel.transport;
using linker.plugins.client; using linker.plugins.client;
using linker.messenger; using linker.messenger;
using linker.messenger.tunnel;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
namespace linker.plugins.tunnel namespace linker.plugins.tunnel
{ {
public sealed class PlusTunnelMessengerAdapter
{
public PlusTunnelMessengerAdapter(ClientSignInState clientSignInState,TunnelConfigTransfer tunnelConfigTransfer, TunnelMessengerAdapter tunnelMessengerAdapter)
{
clientSignInState.NetworkEnabledHandle += (times) => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan);
tunnelConfigTransfer.OnChanged += () => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan);
}
}
public sealed class PlusTunnelMessengerAdapterStore : ITunnelMessengerAdapterStore public sealed class PlusTunnelMessengerAdapterStore : ITunnelMessengerAdapterStore
{ {
public IConnection SignConnection => clientSignInState.Connection; public IConnection SignConnection => clientSignInState.Connection;
public NetworkInfo Network => GetLocalConfig(); public NetworkInfo Network => GetLocalConfig();
public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate; public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate;
public List<TunnelTransportItemInfo> TunnelTransports => tunnelConfigTransfer.Transports; public List<TunnelTransportItemInfo> TunnelTransports => tunnelConfigTransfer.Transports;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly TunnelConfigTransfer tunnelConfigTransfer; private readonly TunnelConfigTransfer tunnelConfigTransfer;
public PlusTunnelMessengerAdapterStore(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer, TunnelMessengerAdapter tunnelMessengerAdapter) public PlusTunnelMessengerAdapterStore(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer)
{ {
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.tunnelConfigTransfer = tunnelConfigTransfer; this.tunnelConfigTransfer = tunnelConfigTransfer;
clientSignInState.NetworkEnabledHandle += (times) => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan);
tunnelConfigTransfer.OnChanged += () => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan);
} }
public bool SetTunnelTransports(List<TunnelTransportItemInfo> list) public bool SetTunnelTransports(List<TunnelTransportItemInfo> list)

View File

@@ -44,6 +44,8 @@ namespace linker.plugins.tunnel
//命令接口 //命令接口
serviceCollection.AddSingleton<PlusTunnelClientMessenger>(); serviceCollection.AddSingleton<PlusTunnelClientMessenger>();
serviceCollection.AddSingleton<ITunnelMessengerAdapterStore, PlusTunnelMessengerAdapterStore>(); serviceCollection.AddSingleton<ITunnelMessengerAdapterStore, PlusTunnelMessengerAdapterStore>();
serviceCollection.AddSingleton<TunnelMessengerAdapter>();
serviceCollection.AddSingleton<PlusTunnelMessengerAdapter>();
serviceCollection.AddSingleton<TunnelExcludeIPTypesLoader>(); serviceCollection.AddSingleton<TunnelExcludeIPTypesLoader>();
@@ -75,6 +77,7 @@ namespace linker.plugins.tunnel
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>(); TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
ITunnelMessengerAdapterStore tunnelAdapter = serviceProvider.GetService<ITunnelMessengerAdapterStore>(); ITunnelMessengerAdapterStore tunnelAdapter = serviceProvider.GetService<ITunnelMessengerAdapterStore>();
PlusTunnelMessengerAdapter plusTunnelMessengerAdapter = serviceProvider.GetService<PlusTunnelMessengerAdapter>();
LoggerHelper.Instance.Info($"tunnel route level getting."); LoggerHelper.Instance.Info($"tunnel route level getting.");
tunnelConfigTransfer.RefreshRouteLevel(); tunnelConfigTransfer.RefreshRouteLevel();

View File

@@ -1,5 +1,5 @@
v1.6.4 v1.6.4
2024-12-19 17:21:14 2024-12-20 17:18:32
1. 优化UI显示网络计算IP数 1. 优化UI显示网络计算IP数
2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题
3. 优化网卡的端口转发 3. 优化网卡的端口转发