diff --git a/linker.messenger.example/Program.cs b/linker.messenger.example/Program.cs new file mode 100644 index 00000000..0c93c9eb --- /dev/null +++ b/linker.messenger.example/Program.cs @@ -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()); + 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 { }); + RelayServerMessenger relayServerMessenger = new RelayServerMessenger(messengerSender, signCaching, serializer, relayServerMasterTransfer, relayServerValidatorTransfer); + + //加载这些信标处理器 + messengerResolver.LoadMessenger(new List + { + 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 TunnelTransports { get; set; } + + + public int Port { get; set; } = 12345; + } + + /// + /// 中继节点信息存储库 + /// + 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) + { + } + } + /// + /// 中继主机信息存储库 + /// + public sealed class RelayServerMasterStore : IRelayServerMasterStore + { + public RelayServerMasterInfo Master => new RelayServerMasterInfo { SecretKey = "snltty" }; + } + + /// + /// 自定义打洞的存储库 + /// + 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 TunnelTransports => Program.publicConfigInfo.TunnelTransports; + + public TunnelMessengerAdapterStore() + { + } + public bool SetTunnelTransports(List list) + { + return true; + } + } + + /// + /// 自定义序列化 + /// + public sealed class Serializer : ISerializer + { + public T Deserialize(ReadOnlySpan buffer) + { + return buffer.GetString().DeJson(); + } + + public byte[] Serialize(T value) + { + return value.ToJson().ToBytes(); + } + } + /// + /// 自定义登录持久化存储 + /// + public sealed class SignInStore : ISignInStore + { + public void Confirm() + { + } + + public bool Delete(string id) + { + return true; + } + + public SignCacheInfo Find(string id) + { + return null; + } + + public IEnumerable Find() + { + return new List(); + } + + public string Insert(SignCacheInfo value) + { + return string.Empty; + } + + public string NewId() + { + return Guid.NewGuid().ToString(); + } + + public bool Update(SignCacheInfo value) + { + return true; + } + } + + +} diff --git a/linker.messenger.example/linker.messenger.example.csproj b/linker.messenger.example/linker.messenger.example.csproj new file mode 100644 index 00000000..0c4c9687 --- /dev/null +++ b/linker.messenger.example/linker.messenger.example.csproj @@ -0,0 +1,18 @@ + + + + Exe + net8.0 + enable + enable + true + + + + + + + + + + diff --git a/linker.messenger.relay/client/RelayClientTransfer.cs b/linker.messenger.relay/client/RelayClientTransfer.cs index 510d6d58..d614acf5 100644 --- a/linker.messenger.relay/client/RelayClientTransfer.cs +++ b/linker.messenger.relay/client/RelayClientTransfer.cs @@ -71,6 +71,8 @@ namespace linker.messenger.relay.client IRelayClientTransport transport = Transports.FirstOrDefault(c => c.Type == relayClientStore.RelayType && relayClientStore.Disabled == false); 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; } diff --git a/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs b/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs index 9d719952..2b426086 100644 --- a/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs +++ b/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs @@ -13,7 +13,7 @@ using linker.messenger.relay.server; namespace linker.messenger.relay.client.transport { - public sealed class RelayClientTransportSelfHost : IRelayClientTransport + public class RelayClientTransportSelfHost : IRelayClientTransport { public string Name => "Linker"; public RelayClientType Type => RelayClientType.Linker; diff --git a/linker.messenger.relay/messenger/RelayMessenger.cs b/linker.messenger.relay/messenger/RelayMessenger.cs index 5fc09a3e..db5d3d24 100644 --- a/linker.messenger.relay/messenger/RelayMessenger.cs +++ b/linker.messenger.relay/messenger/RelayMessenger.cs @@ -46,7 +46,7 @@ namespace linker.messenger.relay.messenger private readonly RelayServerValidatorTransfer relayValidatorTransfer; 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.signCaching = signCaching; diff --git a/linker.messenger.relay/server/RelayServerNodeTransfer.cs b/linker.messenger.relay/server/RelayServerNodeTransfer.cs index 4a0f7eb9..7fb87a12 100644 --- a/linker.messenger.relay/server/RelayServerNodeTransfer.cs +++ b/linker.messenger.relay/server/RelayServerNodeTransfer.cs @@ -1,6 +1,5 @@ using linker.libs; using linker.libs.extends; -using linker.messenger.relay.server.caching; using System.Buffers; using System.Net; using System.Net.Sockets; @@ -19,13 +18,11 @@ namespace linker.messenger.relay.server RelaySpeedLimit limitTotal = new RelaySpeedLimit(); private readonly ISerializer serializer; - private readonly IRelayServerCaching relayCaching; private readonly IRelayServerNodeStore relayServerNodeStore; 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.relayCaching = relayCaching; this.relayServerNodeStore = relayServerNodeStore; this.relayServerMasterStore = relayServerMasterStore; diff --git a/linker.messenger.tunnel/TunnelMessengerAdapter.cs b/linker.messenger.tunnel/TunnelMessengerAdapter.cs index d23151b0..7d3f410b 100644 --- a/linker.messenger.tunnel/TunnelMessengerAdapter.cs +++ b/linker.messenger.tunnel/TunnelMessengerAdapter.cs @@ -97,7 +97,6 @@ namespace linker.plugins.tunnel transportUdpPortMap, new TransportUdp(), }); - } private NetworkInfo GetLocalConfig() diff --git a/linker.messenger/MessengerResolver.cs b/linker.messenger/MessengerResolver.cs index 141b8115..7f4e9a79 100644 --- a/linker.messenger/MessengerResolver.cs +++ b/linker.messenger/MessengerResolver.cs @@ -12,6 +12,7 @@ namespace linker.messenger public interface IMessengerResolver { public void Initialize(string certificate, string password); + public void Initialize(X509Certificate2 certificate); public Task BeginReceiveClient(Socket socket); public Task BeginReceiveClient(Socket socket, bool sendFlag, byte flag); public void LoadMessenger(List list); @@ -31,7 +32,7 @@ namespace linker.messenger private readonly IMessengerSender messengerSender; - private X509Certificate serverCertificate; + private X509Certificate2 serverCertificate; public MessengerResolver(IMessengerSender messengerSender) { this.messengerSender = messengerSender; @@ -42,7 +43,7 @@ namespace linker.messenger string path = Path.GetFullPath(certificate); if (File.Exists(path)) { - serverCertificate = new X509Certificate(path, password); + serverCertificate = new X509Certificate2(path, password, X509KeyStorageFlags.Exportable); } else { @@ -50,6 +51,10 @@ namespace linker.messenger Environment.Exit(0); } } + public void Initialize(X509Certificate2 certificate) + { + serverCertificate = certificate; + } public virtual void AddReceive(ushort id, ulong bytes) { } public virtual void AddSendt(ushort id, ulong bytes) { } diff --git a/linker.signin/SignInMessenger.cs b/linker.signin/SignInMessenger.cs index d715c67f..4d0ab4b9 100644 --- a/linker.signin/SignInMessenger.cs +++ b/linker.signin/SignInMessenger.cs @@ -1,6 +1,5 @@ using linker.libs; using linker.libs.extends; -using linker.messenger; namespace linker.messenger.signin { @@ -10,7 +9,7 @@ namespace linker.messenger.signin private readonly IMessengerSender messengerSender; private readonly ISerializer serializer; - public SignInServerMessenger(SignCaching signCaching, IMessengerSender messengerSender, ISerializer serializer) + public SignInServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, ISerializer serializer) { this.signCaching = signCaching; this.messengerSender = messengerSender; diff --git a/linker.sln b/linker.sln index d4d75624..7cfd7e67 100644 --- a/linker.sln +++ b/linker.sln @@ -19,7 +19,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.signin", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.tunnel", "linker.messenger.tunnel\linker.messenger.tunnel.csproj", "{92582A55-8BBF-4B82-892D-75CEC8969EAF}" 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 Global 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|x86.ActiveCfg = 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 GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/linker/plugins/relay/RelayStartup.cs b/linker/plugins/relay/RelayStartup.cs index 91e84275..d96d0605 100644 --- a/linker/plugins/relay/RelayStartup.cs +++ b/linker/plugins/relay/RelayStartup.cs @@ -30,7 +30,7 @@ namespace linker.plugins.relay public void AddClient(ServiceCollection serviceCollection, FileConfig config) { - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/linker/plugins/relay/client/PlusRelayClientStore.cs b/linker/plugins/relay/client/PlusRelayClientStore.cs index 10b09932..dfefceab 100644 --- a/linker/plugins/relay/client/PlusRelayClientStore.cs +++ b/linker/plugins/relay/client/PlusRelayClientStore.cs @@ -1,4 +1,5 @@ -using linker.messenger; +using linker.libs; +using linker.messenger; using linker.messenger.relay.client; using linker.messenger.relay.client.transport; using linker.plugins.client; @@ -7,7 +8,11 @@ using System.Security.Cryptography.X509Certificates; 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); diff --git a/linker/plugins/relay/server/PlusRelayServerMasterStore.cs b/linker/plugins/relay/server/PlusRelayServerMasterStore.cs index 7935d5b5..42b2f5dc 100644 --- a/linker/plugins/relay/server/PlusRelayServerMasterStore.cs +++ b/linker/plugins/relay/server/PlusRelayServerMasterStore.cs @@ -1,6 +1,4 @@ using linker.messenger.relay.server; -using linker.plugins.resolver; -using linker.plugins.server; namespace linker.plugins.relay.server { diff --git a/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs b/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs index 407821b2..2815924b 100644 --- a/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs +++ b/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs @@ -1,32 +1,36 @@ using linker.tunnel.transport; using linker.plugins.client; using linker.messenger; -using linker.messenger.tunnel; using System.Security.Cryptography.X509Certificates; 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 IConnection SignConnection => clientSignInState.Connection; - public NetworkInfo Network => GetLocalConfig(); - public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate; - public List TunnelTransports => tunnelConfigTransfer.Transports; private readonly ClientSignInState clientSignInState; private readonly ClientConfigTransfer clientConfigTransfer; 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.clientConfigTransfer = clientConfigTransfer; this.tunnelConfigTransfer = tunnelConfigTransfer; - clientSignInState.NetworkEnabledHandle += (times) => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan); - tunnelConfigTransfer.OnChanged += () => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan); + } public bool SetTunnelTransports(List list) diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs index 03579543..1f680645 100644 --- a/linker/plugins/tunnel/TunnelStartup.cs +++ b/linker/plugins/tunnel/TunnelStartup.cs @@ -44,6 +44,8 @@ namespace linker.plugins.tunnel //命令接口 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -75,6 +77,7 @@ namespace linker.plugins.tunnel TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService(); ITunnelMessengerAdapterStore tunnelAdapter = serviceProvider.GetService(); + PlusTunnelMessengerAdapter plusTunnelMessengerAdapter = serviceProvider.GetService(); LoggerHelper.Instance.Info($"tunnel route level getting."); tunnelConfigTransfer.RefreshRouteLevel(); diff --git a/version.txt b/version.txt index 98fb08aa..df3857c8 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,5 @@ v1.6.4 -2024-12-19 17:21:14 +2024-12-20 17:18:32 1. 优化UI,显示网络计算IP数 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 3. 优化网卡的端口转发