diff --git a/linker.tunnel/TunnelUpnpTransfer.cs b/linker.tunnel/TunnelUpnpTransfer.cs index 04181dd9..ee420c65 100644 --- a/linker.tunnel/TunnelUpnpTransfer.cs +++ b/linker.tunnel/TunnelUpnpTransfer.cs @@ -1,8 +1,6 @@ using linker.libs; -using linker.tunnel.transport; using Mono.Nat; using System.Collections.Concurrent; -using System.Net; namespace linker.tunnel { @@ -17,13 +15,8 @@ namespace linker.tunnel public MapInfo PortMap => MapInfo1 ?? MapInfo; - private readonly TransportTcpPortMap transportTcpPortMap; - private readonly TransportUdpPortMap transportUdpPortMap; - public TunnelUpnpTransfer(TransportTcpPortMap transportTcpPortMap, TransportUdpPortMap transportUdpPortMap) + public TunnelUpnpTransfer() { - this.transportTcpPortMap = transportTcpPortMap; - this.transportUdpPortMap = transportUdpPortMap; - NatUtility.DeviceFound += DeviceFound; NatUtility.StartDiscovery(); LoopDiscovery(); @@ -101,20 +94,14 @@ namespace linker.tunnel return false; } - public void SetMap(IPAddress lanIP, int privatePort) + public void SetMap(int privatePort) { - int ip = lanIP.GetAddressBytes()[3]; - MapInfo = new MapInfo { PrivatePort = privatePort, PublicPort = privatePort + ip }; + MapInfo = new MapInfo { PrivatePort = privatePort, PublicPort = privatePort }; AddMap(); - - _ = transportTcpPortMap.Listen(privatePort); - _ = transportUdpPortMap.Listen(privatePort); } public void SetMap(int privatePort, int publicPort) { MapInfo1 = new MapInfo { PrivatePort = privatePort, PublicPort = publicPort }; - _ = transportTcpPortMap.Listen(privatePort); - _ = transportUdpPortMap.Listen(privatePort); } } diff --git a/linker.tunnel/transport/TransportTcpPortMap.cs b/linker.tunnel/transport/TransportTcpPortMap.cs index 731b68b6..312d03c5 100644 --- a/linker.tunnel/transport/TransportTcpPortMap.cs +++ b/linker.tunnel/transport/TransportTcpPortMap.cs @@ -55,28 +55,32 @@ namespace linker.tunnel.transport Socket socket; + SemaphoreSlim slim = new SemaphoreSlim(1); public async Task Listen(int localPort) { - if (socket != null && (socket.LocalEndPoint as IPEndPoint).Port == localPort) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Warning($"{Name} {socket.LocalEndPoint} already exists"); - } - return; - } - + await slim.WaitAsync(); try { - socket?.SafeClose(); if (localPort == 0) return; + if (socket != null && (socket.LocalEndPoint as IPEndPoint).Port == localPort) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Warning($"{Name} {socket.LocalEndPoint} already exists"); + } + return; + } + + socket?.SafeClose(); + IPAddress localIP = IPAddress.Any; - socket = new Socket(localIP.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); - socket.IPv6Only(localIP.AddressFamily, false); - socket.ReuseBind(new IPEndPoint(localIP, localPort)); - socket.Listen(int.MaxValue); + Socket _socket = new Socket(localIP.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); + _socket.IPv6Only(localIP.AddressFamily, false); + _socket.ReuseBind(new IPEndPoint(localIP, localPort)); + _socket.Listen(int.MaxValue); + socket = _socket; if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { @@ -126,6 +130,10 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Error(ex); } } + finally + { + slim.Release(); + } } public async Task ConnectAsync(TunnelTransportInfo tunnelTransportInfo) diff --git a/linker/plugins/sforward/SForwardDecenter.cs b/linker/plugins/sforward/SForwardDecenter.cs index e992d3b8..99b17c9f 100644 --- a/linker/plugins/sforward/SForwardDecenter.cs +++ b/linker/plugins/sforward/SForwardDecenter.cs @@ -11,17 +11,21 @@ namespace linker.plugins.sforward public string Name => "sforward"; public VersionManager SyncVersion { get; } = new VersionManager(); public VersionManager DataVersion { get; } = new VersionManager(); - public ConcurrentDictionary CountDic { get; } = new ConcurrentDictionary(); private readonly ClientConfigTransfer clientConfigTransfer; private readonly SForwardTransfer sForwardTransfer; - public SForwardDecenter( ClientConfigTransfer clientConfigTransfer, SForwardTransfer sForwardTransfer) + public SForwardDecenter(ClientConfigTransfer clientConfigTransfer, SForwardTransfer sForwardTransfer) { this.clientConfigTransfer = clientConfigTransfer; this.sForwardTransfer = sForwardTransfer; } + public void Refresh() + { + SyncVersion.Add(); + } + public Memory GetData() { CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = sForwardTransfer.Count }; @@ -44,10 +48,6 @@ namespace linker.plugins.sforward } DataVersion.Add(); } - public void Refresh() - { - SyncVersion.Add(); - } } [MemoryPackable] diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs index f9e109c2..ad827c40 100644 --- a/linker/plugins/tunnel/TunnelAdapter.cs +++ b/linker/plugins/tunnel/TunnelAdapter.cs @@ -24,6 +24,10 @@ namespace linker.plugins.tunnel private readonly TunnelUpnpTransfer tunnelUpnpTransfer; private readonly TunnelTransfer tunnelTransfer; + + private readonly TransportTcpPortMap transportTcpPortMap; + private readonly TransportUdpPortMap transportUdpPortMap; + public TunnelAdapter(ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelExcludeIPTransfer excludeIPTransfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer, TunnelWanPortTransfer tunnelWanPortTransfer, TunnelUpnpTransfer tunnelUpnpTransfer, TunnelTransfer tunnelTransfer) @@ -48,18 +52,20 @@ namespace linker.plugins.tunnel tunnelTransfer.ServerHost = () => clientSignInState.Connection?.Address ?? null; tunnelTransfer.Certificate = () => tunnelConfigTransfer.Certificate; tunnelTransfer.GetTunnelTransports = () => tunnelConfigTransfer.Transports; - tunnelTransfer.SetTunnelTransports = (transports,update) => tunnelConfigTransfer.SetTransports(transports); + tunnelTransfer.SetTunnelTransports = (transports, update) => tunnelConfigTransfer.SetTransports(transports); tunnelTransfer.GetLocalConfig = GetLocalConfig; tunnelTransfer.GetRemoteWanPort = GetRemoteWanPort; tunnelTransfer.SendConnectBegin = SendConnectBegin; tunnelTransfer.SendConnectFail = SendConnectFail; tunnelTransfer.SendConnectSuccess = SendConnectSuccess; + transportTcpPortMap = new TransportTcpPortMap(); + transportUdpPortMap = new TransportUdpPortMap(); tunnelTransfer.LoadTransports(tunnelWanPortTransfer, tunnelUpnpTransfer, new List { new TunnelTransportTcpNutssb(), new TransportMsQuic(), new TransportTcpP2PNAT(), - new TransportTcpPortMap(), - new TransportUdpPortMap(), + transportTcpPortMap, + transportUdpPortMap, new TransportUdp(), }); @@ -149,11 +155,21 @@ namespace linker.plugins.tunnel if (tunnelConfigTransfer.PortMapLan > 0) { tunnelUpnpTransfer.SetMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan); + _ = transportTcpPortMap.Listen(tunnelConfigTransfer.PortMapLan); + _ = transportUdpPortMap.Listen(tunnelConfigTransfer.PortMapLan); } else { - tunnelUpnpTransfer.SetMap(clientSignInState.Connection.LocalAddress.Address, 18180); + if (clientSignInState.Connected) + { + int ip = clientSignInState.Connection.LocalAddress.Address.GetAddressBytes()[3]; + tunnelUpnpTransfer.SetMap(18180 + ip); + + _ = transportTcpPortMap.Listen(18180 + ip); + _ = transportUdpPortMap.Listen(18180 + ip); + } } + } } } diff --git a/linker/plugins/tunnel/TunnelDecenter.cs b/linker/plugins/tunnel/TunnelDecenter.cs index 1a42a2a5..5505cd7e 100644 --- a/linker/plugins/tunnel/TunnelDecenter.cs +++ b/linker/plugins/tunnel/TunnelDecenter.cs @@ -19,10 +19,6 @@ namespace linker.plugins.tunnel this.tunnelConfigTransfer = tunnelConfigTransfer; tunnelConfigTransfer.OnChanged += Refresh; } - - /// - /// 刷新关于隧道的配置信息,也就是获取自己的和别的客户端的,方便查看 - /// public void Refresh() { SyncVersion.Add(); diff --git a/linker/plugins/tuntap/TuntapAdapter.cs b/linker/plugins/tuntap/TuntapAdapter.cs index 4e11e1bf..70aa7fe7 100644 --- a/linker/plugins/tuntap/TuntapAdapter.cs +++ b/linker/plugins/tuntap/TuntapAdapter.cs @@ -1,7 +1,6 @@ using linker.libs; using linker.plugins.client; using linker.plugins.route; -using linker.plugins.tunnel; using linker.plugins.tuntap.config; using linker.tun; using System.Net; diff --git a/linker/startup/StartupTransfer.cs b/linker/startup/StartupTransfer.cs index e921dd12..76627325 100644 --- a/linker/startup/StartupTransfer.cs +++ b/linker/startup/StartupTransfer.cs @@ -14,66 +14,7 @@ namespace linker.startup /// public static void Init(FileConfig config) { - List temps = GetSourceGeneratorInstances().OrderByDescending(c => c.Level).ToList(); - TestDependent(temps); - LoadPlugins(config, temps); - } - /// - /// 检查插件依赖 - /// - /// - private static void TestDependent(List temps) - { - IEnumerable names = temps.Select(c => c.Name); - foreach (IStartup item in temps.Where(c => c.Dependent.Length > 0)) - { - IEnumerable excepts = item.Dependent.Except(names); - if (excepts.Any()) - { - LoggerHelper.Instance.Error($"【{item.Name}】dependent by {string.Join(",", excepts)},but it not exists"); - } - } - } - /// - /// 加载插件 - /// - /// - /// - private static void LoadPlugins(FileConfig config, List temps) - { - //只要哪些 - if (config.Data.Common.IncludePlugins.Length > 0) - { - temps = temps.Where(c => c.Required || config.Data.Common.IncludePlugins.Contains(c.Name)).ToList(); - } - //不要哪些 - else if (config.Data.Common.ExcludePlugins.Length > 0) - { - temps = temps.Where(c => c.Required || config.Data.Common.ExcludePlugins.Contains(c.Name) == false).ToList(); - } - - LoadDependents(temps, temps.Select(c => c.Name)); - startups = startups.Distinct().ToList(); - - config.Data.Common.Plugins = startups.Select(c => c.Name).ToArray(); - - LoggerHelper.Instance.Info($"load startup : {string.Join(",", startups.Select(c => c.GetType().Name))}"); - } - /// - /// 加载插件依赖 - /// - /// - /// - private static void LoadDependents(List all, IEnumerable sependents) - { - if (sependents.Any() == false) return; - - IEnumerable temps = all.Where(c => sependents.Contains(c.Name)); - IEnumerable _sependents = temps.SelectMany(c => c.Dependent); - - startups.AddRange(temps); - - LoadDependents(all, _sependents); + startups = GetSourceGeneratorInstances().OrderByDescending(c => c.Level).Distinct().ToList(); } /// @@ -81,7 +22,6 @@ namespace linker.startup /// /// /// - /// public static void Add(ServiceCollection serviceCollection, FileConfig config) { LoggerHelper.Instance.Info($"add startup : {string.Join(",", startups.Select(c => c.GetType().Name))}"); diff --git a/version.txt b/version.txt index cec99a3f..1324e84a 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,5 @@ v1.6.3 -2024-12-13 15:52:27 +2024-12-13 17:19:41 1. 优化UI,显示网络计算IP数 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 3. 优化网卡的端口转发