diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 7b63187f..34689f00 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -35,7 +35,7 @@ jobs: release_name: v1.6.9.${{ steps.date.outputs.today }} draft: false prerelease: false - body: "1. 优化linux下路由跟踪问题\r\n2. 优化linux下获取本机IP问题\r\n3. 增加ICS,让win7+、win server2008+支持NAT\r\n4. 增加中继卡密\r\n5. 增加内外穿透定时开关功能\r\n6. 优化管理页面连接接口的体验\r\n7. 优化一些UI体验,去除同步页面,将同步功能放置各个实际的位置\r\n8. 其它一些修复优化" + body: "1. 优化linux下路由跟踪问题\r\n2. 优化linux下获取本机IP问题\r\n3. 增加ICS,让win7+、win server2008+支持NAT\r\n4. 增加中继cdkey,使用cdkey解锁公开中继节点的带宽、流量、连接数限制\r\n5. 增加内外穿透定时开关功能\r\n6. 优化管理页面连接接口的体验\r\n7. 优化一些UI体验,去除同步页面,将同步功能放至各个实际的位置\r\n8. 优化端口转发,让不同分组间可以使用相同端口\r\n9. 其它一些修复优化" - name: publish projects run: ./publish.bat - name: upload-win-x86-oss diff --git a/README.md b/README.md index da258968..188de7d0 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ For user convenience, this project provides **public messenger servers** and **p - [x] Distributed architecture: Multiple relay nodes for massive scalability - [x] SOCKS5 proxy: Dynamic port forwarding without specifying ports - [x] Easy integration: Use `linker.messenger.entry` to embed into your projects +- [x] CDKEY,It can temporarily lift certain restrictions ## Quick Integration In a .NET 8+ project, install the NuGet package `linker.messenger.entry` diff --git a/README_zh.md b/README_zh.md index f02cd898..14d14988 100644 --- a/README_zh.md +++ b/README_zh.md @@ -58,6 +58,7 @@ - [x] 分布式,多中继服务器节点,承载海量设备 - [x] socks5代理,端口转发需要指定端口,而socks5代理可以代理所有端口 - [x] 集成linker,使用`linker.messenger.entry`入口库,轻松集成到你的项目中 +- [x] CDKEY,可以临时解锁一些限制,中继,内外穿透什么的 ## 轻松集成 在.NET8+项目中,nuget 安装 `linker.messenger.entry` diff --git a/src/linker.doc.web/docs/1、首页.md b/src/linker.doc.web/docs/1、首页.md index 0c697d8d..3dc207fc 100644 --- a/src/linker.doc.web/docs/1、首页.md +++ b/src/linker.doc.web/docs/1、首页.md @@ -44,7 +44,7 @@ sidebar_position: 1 - [x] 分布式,多中继服务器节点,承载海量设备 - [x] socks5代理,端口转发需要指定端口,而socks5代理可以代理所有端口 - [x] 集成linker,使用`linker.messenger.entry`入口库,轻松集成到你的项目中 - +- [x] CDKEY,可以临时解锁一些限制,中继,内外穿透什么的 #### 1.4、加入组织 你可以加入QQ群:1121552990 diff --git a/src/linker.libs/TimerHelper.cs b/src/linker.libs/TimerHelper.cs index f110e189..57608593 100644 --- a/src/linker.libs/TimerHelper.cs +++ b/src/linker.libs/TimerHelper.cs @@ -13,48 +13,87 @@ namespace linker.libs action(); }); } + public static void SetInterval(Func action, int delayMs) { Task.Run(async () => { - while (true) + while (action()) { - if (action() == false) - { - break; - } await Task.Delay(delayMs).ConfigureAwait(false); } }); } + public static void SetIntervalLong(Func action, int delayMs) + { + Task.Factory.StartNew(async () => + { + while (action()) + { + await Task.Delay(delayMs).ConfigureAwait(false); + } + }, TaskCreationOptions.LongRunning); + } + public static void SetInterval(Func> action, int delayMs) + { + Task.Run(async () => + { + while (await action()) + { + await Task.Delay(delayMs).ConfigureAwait(false); + } + }); + } + public static void SetIntervalLong(Func> action, int delay) + { + Task.Factory.StartNew(async () => + { + while (await action()) + { + await Task.Delay(delay).ConfigureAwait(false); + } + }, TaskCreationOptions.LongRunning); + } public static void SetInterval(Func action, Func delay) { Task.Run(async () => { - while (true) + while (action()) { - if (action() == false) - { - break; - } await Task.Delay(delay()).ConfigureAwait(false); } }); } + public static void SetIntervalLong(Func action, Func delay) + { + Task.Factory.StartNew(async () => + { + while (action()) + { + await Task.Delay(delay()).ConfigureAwait(false); + } + }, TaskCreationOptions.LongRunning); + } public static void SetInterval(Func> action, Func delay) { Task.Run(async () => { - while (true) + while (await action()) { - if (await action() == false) - { - break; - } await Task.Delay(delay()).ConfigureAwait(false); } }); } + public static void SetIntervalLong(Func> action, Func delay) + { + Task.Factory.StartNew(async () => + { + while (await action()) + { + await Task.Delay(delay()).ConfigureAwait(false); + } + }, TaskCreationOptions.LongRunning); + } public static void Async(Action action) { @@ -68,5 +107,6 @@ namespace linker.libs { Task.Factory.StartNew(action,TaskCreationOptions.LongRunning); } + } } diff --git a/src/linker.messenger.decenter/DecenterClientTransfer.cs b/src/linker.messenger.decenter/DecenterClientTransfer.cs index 8da79f3b..a3c4c9f4 100644 --- a/src/linker.messenger.decenter/DecenterClientTransfer.cs +++ b/src/linker.messenger.decenter/DecenterClientTransfer.cs @@ -53,7 +53,7 @@ namespace linker.messenger.decenter private void SyncTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { try { @@ -100,7 +100,7 @@ namespace linker.messenger.decenter } } return true; - }, () => 300); + }, 300); } class DecenterSyncTaskInfo diff --git a/src/linker.messenger.flow/ExternalFlow.cs b/src/linker.messenger.flow/ExternalFlow.cs index 44d3a8b4..768870b0 100644 --- a/src/linker.messenger.flow/ExternalFlow.cs +++ b/src/linker.messenger.flow/ExternalFlow.cs @@ -4,8 +4,8 @@ namespace linker.messenger.flow { public sealed class ExternalFlow : IFlow { - public ulong ReceiveBytes { get; private set; } - public ulong SendtBytes { get; private set; } + public long ReceiveBytes { get; private set; } + public long SendtBytes { get; private set; } public string FlowName => "External"; public VersionManager Version { get; } = new VersionManager(); @@ -16,11 +16,11 @@ namespace linker.messenger.flow public string GetItems() => string.Empty; public void SetItems(string json) { } - public void SetBytes(ulong receiveBytes, ulong sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } + public void SetBytes(long receiveBytes, long sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } public void Clear() { ReceiveBytes = 0; SendtBytes = 0;} - public void AddReceive(ulong bytes) { ReceiveBytes += bytes; Version.Add(); } - public void AddSendt(ulong bytes) { SendtBytes += bytes; Version.Add(); } + public void AddReceive(long bytes) { ReceiveBytes += bytes; Version.Add(); } + public void AddSendt(long bytes) { SendtBytes += bytes; Version.Add(); } } @@ -35,8 +35,8 @@ namespace linker.messenger.flow this.externalFlow = externalFlow; } - public override void AddReceive(ulong bytes) { externalFlow.AddReceive(bytes); } - public override void AddSendt(ulong bytes) { externalFlow.AddSendt(bytes); } + public override void AddReceive(long bytes) { externalFlow.AddReceive(bytes); } + public override void AddSendt(long bytes) { externalFlow.AddSendt(bytes); } } diff --git a/src/linker.messenger.flow/FlowResolver.cs b/src/linker.messenger.flow/FlowResolver.cs index d7870dbe..9e7fea95 100644 --- a/src/linker.messenger.flow/FlowResolver.cs +++ b/src/linker.messenger.flow/FlowResolver.cs @@ -18,11 +18,11 @@ namespace linker.messenger.flow /// /// 在线 | 总数 /// - public ulong ReceiveBytes { get; private set; } + public long ReceiveBytes { get; private set; } /// /// 服务器数 /// - public ulong SendtBytes { get; private set; } + public long SendtBytes { get; private set; } private ConcurrentDictionary servers = new ConcurrentDictionary(new IPAddressComparer()); @@ -69,7 +69,7 @@ namespace linker.messenger.flow public string GetItems() => string.Empty; public void SetItems(string json) { } - public void SetBytes(ulong receiveBytes, ulong sendtBytes) { } + public void SetBytes(long receiveBytes, long sendtBytes) { } public void Clear() { } @@ -86,7 +86,7 @@ namespace linker.messenger.flow private void OnlineTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { try { @@ -110,11 +110,11 @@ namespace linker.messenger.flow servers.TryRemove(key, out _); } - ulong online = (ulong)servers.Sum(c => c.Value.Online) << 32; - ulong total = (ulong)servers.Sum(c => c.Value.Total); + long online = servers.Sum(c => c.Value.Online) << 32; + long total = servers.Sum(c => c.Value.Total); ReceiveBytes = online | total; - SendtBytes = (ulong)servers.Count; + SendtBytes = servers.Count; Version.Add(); } private void Report() diff --git a/src/linker.messenger.flow/IFlow.cs b/src/linker.messenger.flow/IFlow.cs index 4984a249..1db4c0a0 100644 --- a/src/linker.messenger.flow/IFlow.cs +++ b/src/linker.messenger.flow/IFlow.cs @@ -5,21 +5,21 @@ namespace linker.messenger.flow { public interface IFlow { - public ulong ReceiveBytes { get; } - public ulong SendtBytes { get; } + public long ReceiveBytes { get; } + public long SendtBytes { get; } public string FlowName { get; } public VersionManager Version { get; } public string GetItems(); public void SetItems(string json); - public void SetBytes(ulong receiveBytes,ulong sendtBytes); + public void SetBytes(long receiveBytes,long sendtBytes); public void Clear(); } public partial class FlowItemInfo { - public ulong ReceiveBytes { get; set; } - public ulong SendtBytes { get; set; } + public long ReceiveBytes { get; set; } + public long SendtBytes { get; set; } [JsonIgnore] public string FlowName { get; set; } diff --git a/src/linker.messenger.flow/IFlowStore.cs b/src/linker.messenger.flow/IFlowStore.cs deleted file mode 100644 index f2d6b978..00000000 --- a/src/linker.messenger.flow/IFlowStore.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace linker.messenger.flow -{ - public interface IFlowStore - { - - } -} diff --git a/src/linker.messenger.flow/MessengerFlow.cs b/src/linker.messenger.flow/MessengerFlow.cs index 095e7fec..c9f6ddaf 100644 --- a/src/linker.messenger.flow/MessengerFlow.cs +++ b/src/linker.messenger.flow/MessengerFlow.cs @@ -12,11 +12,11 @@ namespace linker.messenger.flow this.messengerFlow = messengerFlow; } - public override void AddReceive(ushort id, ulong bytes) + public override void AddReceive(ushort id, long bytes) { messengerFlow.AddReceive(id, bytes); } - public override void AddSendt(ushort id, ulong bytes) + public override void AddSendt(ushort id, long bytes) { messengerFlow.AddSendt(id, bytes); } @@ -29,11 +29,11 @@ namespace linker.messenger.flow this.messengerFlow = messengerFlow; } - public override void AddReceive(ushort id, ulong bytes) + public override void AddReceive(ushort id, long bytes) { messengerFlow.AddReceive(id, bytes); } - public override void AddSendt(ushort id, ulong bytes) + public override void AddSendt(ushort id, long bytes) { messengerFlow.AddSendt(id, bytes); } @@ -43,8 +43,8 @@ namespace linker.messenger.flow public sealed class MessengerFlow : IFlow { - public ulong ReceiveBytes { get; private set; } - public ulong SendtBytes { get; private set; } + public long ReceiveBytes { get; private set; } + public long SendtBytes { get; private set; } public string FlowName => "Messenger"; public VersionManager Version { get; } = new VersionManager(); @@ -56,10 +56,10 @@ namespace linker.messenger.flow public string GetItems() => flows.ToJson(); public void SetItems(string json) { flows = json.DeJson>(); } - public void SetBytes(ulong receiveBytes, ulong sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } + public void SetBytes(long receiveBytes, long sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } public void Clear() { ReceiveBytes = 0; SendtBytes = 0;flows.Clear(); } - public void AddReceive(ushort id, ulong bytes) + public void AddReceive(ushort id, long bytes) { if (flows.TryGetValue(id, out FlowItemInfo messengerFlowItemInfo) == false) { @@ -70,7 +70,7 @@ namespace linker.messenger.flow messengerFlowItemInfo.ReceiveBytes += bytes; Version.Add(); } - public void AddSendt(ushort id, ulong bytes) + public void AddSendt(ushort id, long bytes) { if (flows.TryGetValue(id, out FlowItemInfo messengerFlowItemInfo) == false) { diff --git a/src/linker.messenger.flow/RelayFlow.cs b/src/linker.messenger.flow/RelayFlow.cs index 09d3102b..bd228b7f 100644 --- a/src/linker.messenger.flow/RelayFlow.cs +++ b/src/linker.messenger.flow/RelayFlow.cs @@ -7,8 +7,8 @@ namespace linker.messenger.flow { public sealed class RelayReportFlow : IFlow { - public ulong ReceiveBytes { get; private set; } - public ulong SendtBytes { get; private set; } + public long ReceiveBytes { get; private set; } + public long SendtBytes { get; private set; } public string FlowName => "RelayReport"; public VersionManager Version { get; } = new VersionManager(); public RelayReportFlow() @@ -16,11 +16,11 @@ namespace linker.messenger.flow } public string GetItems() => string.Empty; public void SetItems(string json) { } - public void SetBytes(ulong receiveBytes, ulong sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } + public void SetBytes(long receiveBytes, long sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } public void Clear() { ReceiveBytes = 0; SendtBytes = 0; } - public void AddReceive(ulong bytes) { ReceiveBytes += bytes; Version.Add(); } - public void AddSendt(ulong bytes) { SendtBytes += bytes; Version.Add(); } + public void AddReceive(long bytes) { ReceiveBytes += bytes; Version.Add(); } + public void AddSendt(long bytes) { SendtBytes += bytes; Version.Add(); } } @@ -32,8 +32,8 @@ namespace linker.messenger.flow this.relayReportFlow = relayReportFlow; } - public override void AddReceive(ulong bytes) { relayReportFlow.AddReceive(bytes); } - public override void AddSendt(ulong bytes) { relayReportFlow.AddSendt(bytes); } + public override void AddReceive(long bytes) { relayReportFlow.AddReceive(bytes); } + public override void AddSendt(long bytes) { relayReportFlow.AddSendt(bytes); } } @@ -47,19 +47,19 @@ namespace linker.messenger.flow this.relayFlow = relayFlow; } - public override void AddReceive(string key, string from, string to, string groupid, ulong bytes) + public override void AddReceive(string key, string from, string to, string groupid, long bytes) { relayFlow.AddReceive(key, from, to, groupid, bytes); } - public override void AddSendt(string key, string from, string to, string groupid, ulong bytes) + public override void AddSendt(string key, string from, string to, string groupid, long bytes) { relayFlow.AddSendt(key, from, to, groupid, bytes); } - public override void AddReceive(string key, ulong bytes) + public override void AddReceive(string key, long bytes) { relayFlow.AddReceive(key, bytes); } - public override void AddSendt(string key, ulong bytes) + public override void AddSendt(string key, long bytes) { relayFlow.AddSendt(key, bytes); } @@ -68,8 +68,8 @@ namespace linker.messenger.flow public sealed class RelayFlow : IFlow { - public ulong ReceiveBytes { get; private set; } - public ulong SendtBytes { get; private set; } + public long ReceiveBytes { get; private set; } + public long SendtBytes { get; private set; } public string FlowName => "Relay"; public VersionManager Version { get; } = new VersionManager(); @@ -79,7 +79,7 @@ namespace linker.messenger.flow public RelayFlow() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { if (lastTicksManager.DiffLessEqual(5000)) { @@ -103,10 +103,10 @@ namespace linker.messenger.flow public string GetItems() => flows.ToJson(); public void SetItems(string json) { flows = json.DeJson>(); } - public void SetBytes(ulong receiveBytes, ulong sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } + public void SetBytes(long receiveBytes, long sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } public void Clear() { ReceiveBytes = 0; SendtBytes = 0;flows.Clear(); } - public void AddReceive(string key, string from, string to, string groupid, ulong bytes) + public void AddReceive(string key, string from, string to, string groupid, long bytes) { if (flows.TryGetValue(key, out RelayFlowItemInfo messengerFlowItemInfo) == false) { @@ -117,7 +117,7 @@ namespace linker.messenger.flow messengerFlowItemInfo.ReceiveBytes += bytes; Version.Add(); } - public void AddSendt(string key, string from, string to, string groupid, ulong bytes) + public void AddSendt(string key, string from, string to, string groupid, long bytes) { if (flows.TryGetValue(key, out RelayFlowItemInfo messengerFlowItemInfo) == false) { @@ -129,7 +129,7 @@ namespace linker.messenger.flow Version.Add(); } - public void AddReceive(string key, ulong bytes) + public void AddReceive(string key, long bytes) { if (flows.TryGetValue(key, out RelayFlowItemInfo messengerFlowItemInfo)) { @@ -139,7 +139,7 @@ namespace linker.messenger.flow } } - public void AddSendt(string key, ulong bytes) + public void AddSendt(string key, long bytes) { if (flows.TryGetValue(key, out RelayFlowItemInfo messengerFlowItemInfo)) { @@ -201,17 +201,17 @@ namespace linker.messenger.flow public sealed partial class RelayFlowItemInfo : FlowItemInfo { - public ulong DiffReceiveBytes { get; set; } - public ulong DiffSendtBytes { get; set; } + public long DiffReceiveBytes { get; set; } + public long DiffSendtBytes { get; set; } public string FromName { get; set; } public string ToName { get; set; } public string GroupId { get; set; } [JsonIgnore] - public ulong OldReceiveBytes { get; set; } + public long OldReceiveBytes { get; set; } [JsonIgnore] - public ulong OldSendtBytes { get; set; } + public long OldSendtBytes { get; set; } } public sealed partial class RelayFlowRequestInfo diff --git a/src/linker.messenger.flow/SForwardFlow.cs b/src/linker.messenger.flow/SForwardFlow.cs index c30e48cd..386a1a23 100644 --- a/src/linker.messenger.flow/SForwardFlow.cs +++ b/src/linker.messenger.flow/SForwardFlow.cs @@ -12,11 +12,11 @@ namespace linker.messenger.flow { this.sForwardFlow = sForwardFlow; } - public override void AddReceive(string key, string groupid, ulong bytes) + public override void AddReceive(string key, string groupid, long bytes) { sForwardFlow.AddReceive(key, groupid, bytes); } - public override void AddSendt(string key, string groupid, ulong bytes) + public override void AddSendt(string key, string groupid, long bytes) { sForwardFlow.AddSendt(key, groupid, bytes); } @@ -24,8 +24,8 @@ namespace linker.messenger.flow public sealed class SForwardFlow : IFlow { - public ulong ReceiveBytes { get; private set; } - public ulong SendtBytes { get; private set; } + public long ReceiveBytes { get; private set; } + public long SendtBytes { get; private set; } public string FlowName => "SForward"; public VersionManager Version { get; } = new VersionManager(); @@ -35,7 +35,7 @@ namespace linker.messenger.flow public SForwardFlow() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { if (lastTicksManager.DiffLessEqual(5000)) { @@ -54,7 +54,7 @@ namespace linker.messenger.flow public string GetItems() => flows.ToJson(); public void SetItems(string json) { flows = json.DeJson>(); } - public void SetBytes(ulong receiveBytes, ulong sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } + public void SetBytes(long receiveBytes, long sendtBytes) { ReceiveBytes = receiveBytes; SendtBytes = sendtBytes; } public void Clear() { ReceiveBytes = 0; SendtBytes = 0;flows.Clear(); } public void Update() @@ -62,7 +62,7 @@ namespace linker.messenger.flow lastTicksManager.Update(); } - public void AddReceive(string key, string groupid, ulong bytes) + public void AddReceive(string key, string groupid, long bytes) { if (flows.TryGetValue(key, out SForwardFlowItemInfo messengerFlowItemInfo) == false) { @@ -73,7 +73,7 @@ namespace linker.messenger.flow messengerFlowItemInfo.ReceiveBytes += bytes; Version.Add(); } - public void AddSendt(string key, string groupid, ulong bytes) + public void AddSendt(string key, string groupid, long bytes) { if (flows.TryGetValue(key, out SForwardFlowItemInfo messengerFlowItemInfo) == false) { @@ -134,16 +134,16 @@ namespace linker.messenger.flow public sealed partial class SForwardFlowItemInfo : FlowItemInfo { - public ulong DiffReceiveBytes { get; set; } - public ulong DiffSendtBytes { get; set; } + public long DiffReceiveBytes { get; set; } + public long DiffSendtBytes { get; set; } public string Key { get; set; } public string GroupId { get; set; } [JsonIgnore] - public ulong OldReceiveBytes { get; set; } + public long OldReceiveBytes { get; set; } [JsonIgnore] - public ulong OldSendtBytes { get; set; } + public long OldSendtBytes { get; set; } } public sealed partial class SForwardFlowRequestInfo diff --git a/src/linker.messenger.flow/messenger/FlowMessenger.cs b/src/linker.messenger.flow/messenger/FlowMessenger.cs index 11516786..9b3a5a58 100644 --- a/src/linker.messenger.flow/messenger/FlowMessenger.cs +++ b/src/linker.messenger.flow/messenger/FlowMessenger.cs @@ -38,7 +38,7 @@ namespace linker.messenger.flow.messenger Dictionary dic = flowTransfer.GetFlows(); signCaching.GetOnline(out int all, out int online); - dic.TryAdd("_", new FlowItemInfo { FlowName = "_", ReceiveBytes = (ulong)all, SendtBytes = (ulong)online }); + dic.TryAdd("_", new FlowItemInfo { FlowName = "_", ReceiveBytes = all, SendtBytes = online }); FlowInfo serverFlowInfo = new FlowInfo { diff --git a/src/linker.messenger.forward/Config.cs b/src/linker.messenger.forward/Config.cs index c0c58408..aab97f38 100644 --- a/src/linker.messenger.forward/Config.cs +++ b/src/linker.messenger.forward/Config.cs @@ -7,7 +7,7 @@ namespace linker.messenger.forward public sealed partial class ForwardInfo { public ForwardInfo() { } - public uint Id { get; set; } + public long Id { get; set; } /// /// 名称 /// @@ -60,7 +60,7 @@ namespace linker.messenger.forward public sealed partial class ForwardRemoveForwardInfo { public string MachineId { get; set; } - public uint Id { get; set; } + public long Id { get; set; } } public sealed partial class ForwardCountInfo { diff --git a/src/linker.messenger.forward/ForwardTransfer.cs b/src/linker.messenger.forward/ForwardTransfer.cs index a5ce6aa9..778cd4fe 100644 --- a/src/linker.messenger.forward/ForwardTransfer.cs +++ b/src/linker.messenger.forward/ForwardTransfer.cs @@ -18,9 +18,6 @@ namespace linker.messenger.forward private readonly IMessengerSender messengerSender; private readonly ISignInClientStore signInClientStore; private readonly ISerializer serializer; - - private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); - public ForwardTransfer(IForwardClientStore forwardClientStore, ForwardProxy forwardProxy, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore, ISerializer serializer) { this.forwardClientStore = forwardClientStore; @@ -54,9 +51,6 @@ namespace linker.messenger.forward { lock (this) { - uint maxid = forwardClientStore.Count() > 0 ? forwardClientStore.Get().Max(c => c.Id) : 1; - ns.Reset(maxid); - foreach (var item in forwardClientStore.Get(signInClientStore.Group.Id)) { if (item.Started) @@ -149,7 +143,7 @@ namespace linker.messenger.forward public bool Add(ForwardInfo forwardInfo) { //同名或者同端口,但是ID不一样 - ForwardInfo old = forwardClientStore.Get().FirstOrDefault(c => (c.Port == forwardInfo.Port && c.Port != 0) && c.MachineId == forwardInfo.MachineId); + ForwardInfo old = forwardClientStore.Get().FirstOrDefault(c => (c.Port == forwardInfo.Port && c.Port != 0) && c.GroupId == signInClientStore.Group.Id && c.MachineId == forwardInfo.MachineId); if (old != null && old.Id != forwardInfo.Id) return false; if (forwardInfo.Id != 0) @@ -169,10 +163,10 @@ namespace linker.messenger.forward old.Started = forwardInfo.Started; old.BufferSize = forwardInfo.BufferSize; old.GroupId = signInClientStore.Group.Id; + forwardClientStore.Update(forwardInfo); } else { - forwardInfo.Id = ns.Increment(); forwardInfo.GroupId = signInClientStore.Group.Id; if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) @@ -186,7 +180,7 @@ namespace linker.messenger.forward return true; } - public bool Remove(uint id) + public bool Remove(long id) { //同名或者同端口,但是ID不一样 ForwardInfo old = forwardClientStore.Get(id); diff --git a/src/linker.messenger.forward/IForwardClientStore.cs b/src/linker.messenger.forward/IForwardClientStore.cs index fe9ffaae..87e6651d 100644 --- a/src/linker.messenger.forward/IForwardClientStore.cs +++ b/src/linker.messenger.forward/IForwardClientStore.cs @@ -18,7 +18,7 @@ /// /// /// - public ForwardInfo Get(uint id); + public ForwardInfo Get(long id); /// /// 根据分组获取 /// @@ -42,7 +42,7 @@ /// /// /// - public bool Remove(uint id); + public bool Remove(long id); /// /// 提交更新 diff --git a/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs b/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs index e916c360..588c1c4d 100644 --- a/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs +++ b/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs @@ -270,7 +270,7 @@ namespace linker.messenger.forward.proxy /// private void TaskUdp() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { if(udpConnections.Count > 0) { diff --git a/src/linker.messenger.logger/Entry.cs b/src/linker.messenger.logger/Entry.cs index ec5e81dd..0d1b6b42 100644 --- a/src/linker.messenger.logger/Entry.cs +++ b/src/linker.messenger.logger/Entry.cs @@ -69,7 +69,7 @@ namespace linker.messenger.logger { } }; - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { string[] files = Directory.GetFiles("logs").OrderBy(c => c).ToArray(); for (int i = 0; i < files.Length - 180; i++) diff --git a/src/linker.messenger.relay/client/RelayApiController.cs b/src/linker.messenger.relay/client/RelayApiController.cs index 59307bae..15950515 100644 --- a/src/linker.messenger.relay/client/RelayApiController.cs +++ b/src/linker.messenger.relay/client/RelayApiController.cs @@ -72,7 +72,7 @@ namespace linker.messenger.relay [Access(AccessValue.RelayCdkey)] public async Task AddCdkey(ApiControllerParamsInfo param) { - RelayServerCdkeyInfo info = param.Content.DeJson(); + RelayServerCdkeyStoreInfo info = param.Content.DeJson(); var resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = signInClientState.Connection, @@ -96,7 +96,7 @@ namespace linker.messenger.relay MessengerId = (ushort)RelayMessengerIds.DelCdkey, Payload = serializer.Serialize(new RelayServerCdkeyDelInfo { - Id = param.Content, + CdkeyId = long.Parse(param.Content), SecretKey = relayClientStore.Server.SecretKey }) }); diff --git a/src/linker.messenger.relay/client/RelayClientTestTransfer.cs b/src/linker.messenger.relay/client/RelayClientTestTransfer.cs index 3c1f2971..4b653240 100644 --- a/src/linker.messenger.relay/client/RelayClientTestTransfer.cs +++ b/src/linker.messenger.relay/client/RelayClientTestTransfer.cs @@ -66,14 +66,14 @@ namespace linker.messenger.relay } private void TestTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { if (lastTicksManager.DiffLessEqual(3000)) { await TaskRelay(); } return true; - }, () => 3000); + }, 3000); } } diff --git a/src/linker.messenger.relay/messenger/RelayMessenger.cs b/src/linker.messenger.relay/messenger/RelayMessenger.cs index 95963189..326a7abb 100644 --- a/src/linker.messenger.relay/messenger/RelayMessenger.cs +++ b/src/linker.messenger.relay/messenger/RelayMessenger.cs @@ -5,6 +5,7 @@ using linker.messenger.relay.client; using linker.messenger.relay.server; using linker.messenger.signin; using linker.messenger.relay.server.validator; +using linker.libs.extends; namespace linker.messenger.relay.messenger { @@ -81,7 +82,7 @@ namespace linker.messenger.relay.messenger TransportName = "test", }, cache, null); - var nodes = relayServerTransfer.GetNodes(string.IsNullOrWhiteSpace(result), info.UserId); + var nodes = relayServerTransfer.GetNodes(string.IsNullOrWhiteSpace(result)); connection.Write(serializer.Serialize(nodes)); } @@ -110,11 +111,11 @@ namespace linker.messenger.relay.messenger bool validated = string.IsNullOrWhiteSpace(error); result.Nodes = relayServerTransfer.GetNodes(validated); - List cdkeys = await relayServerCdkeyStore.Get(info.UserId); + List cdkeys = await relayServerCdkeyStore.GetAvailable(info.UserId); if (result.Nodes.Count > 0) { - result.FlowingId = relayServerTransfer.AddRelay(cacheFrom.MachineId, cacheFrom.MachineName, cacheTo.MachineId, cacheTo.MachineName, cacheFrom.GroupId, validated, cdkeys); + result.FlowingId = relayServerTransfer.AddRelay(cacheFrom.MachineId, cacheFrom.MachineName, cacheTo.MachineId, cacheTo.MachineName, cacheFrom.GroupId, validated, cdkeys.Select(c => new RelayServerCdkeyInfo { Bandwidth = c.Bandwidth, CdkeyId = c.CdkeyId, LastBytes = c.LastBytes }).ToList()); } connection.Write(serializer.Serialize(result)); @@ -230,7 +231,7 @@ namespace linker.messenger.relay.messenger return; } - await relayServerCdkeyStore.Del(info.Id); + await relayServerCdkeyStore.Del(info.CdkeyId); connection.Write(Helper.TrueArray); } @@ -266,9 +267,17 @@ namespace linker.messenger.relay.messenger /// /// [MessengerId((ushort)RelayMessengerIds.NodeGetCache)] - public async Task NodeGetCache(IConnection connection) + public void NodeGetCache(IConnection connection) { - + string key = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (relayServerTransfer.TryGetRelayCache(key, out RelayCacheInfo cache)) + { + connection.Write(serializer.Serialize(cache)); + } + else + { + connection.Write(Helper.EmptyArray); + } } /// /// 获取缓存 @@ -276,9 +285,14 @@ namespace linker.messenger.relay.messenger /// /// [MessengerId((ushort)RelayMessengerIds.NodeReport)] - public async Task NodeReport(IConnection connection) + public void NodeReport(IConnection connection) { - + RelayServerNodeReportInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Debug($"relay node report : {info.ToJson()}"); + } + relayServerTransfer.SetNodeReport(connection, info); } /// /// 消耗流量报告 @@ -288,12 +302,14 @@ namespace linker.messenger.relay.messenger [MessengerId((ushort)RelayMessengerIds.TrafficReport)] public async Task TrafficReport(IConnection connection) { - RelayTrafficReportInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - if (relayServerStore.SecretKey != info.SecretKey ) + RelayTrafficUpdateInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (relayServerStore.SecretKey != info.SecretKey) { - connection.Write(serializer.Serialize(new Dictionary())); + connection.Write(serializer.Serialize(new Dictionary())); return; } + Dictionary result = await relayServerTransfer.AddTraffic(info); + connection.Write(serializer.Serialize(result)); } } } diff --git a/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs b/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs index ac0d5ab9..f7df8103 100644 --- a/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs +++ b/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs @@ -2,18 +2,41 @@ { public interface IRelayServerCdkeyStore { - public Task Add(RelayServerCdkeyInfo info); - public Task Del(string id); + public Task Add(RelayServerCdkeyStoreInfo info); + public Task Del(long id); /// /// 获取有效的CDKEY /// /// /// - public Task> Get(string userid); + public Task> GetAvailable(string userid); + public Task> Get(List ids); + + public Task Traffic(Dictionary dic); public Task Get(RelayServerCdkeyPageRequestInfo relayServerCdkeyPageRequestInfo); } + public sealed class RelayServerCdkeyConfigInfo + { + /// + /// 获取可用的CDKEY + /// + public string CdkeyAvailablePostUrl { get; set; } = string.Empty; + /// + /// 分页获取CDKEY + /// + public string CdkeyPagePostUrl { get; set; } = string.Empty; + /// + /// id列表获取CDKEY + /// + public string CdkeyListPostUrl { get; set; } = string.Empty; + /// + /// 报告流量websocket + /// + public string CdkeyTrafficWsUrl { get; set; } = string.Empty; + } + public sealed partial class RelayServerCdkeyPageRequestInfo { public int Page { get; set; } @@ -29,24 +52,24 @@ public int Page { get; set; } public int Size { get; set; } public int Count { get; set; } - public List List { get; set; } + public List List { get; set; } } public sealed partial class RelayServerCdkeyAddInfo { public string SecretKey { get; set; } - public RelayServerCdkeyInfo Data { get; set; } + public RelayServerCdkeyStoreInfo Data { get; set; } } public sealed partial class RelayServerCdkeyDelInfo { public string SecretKey { get; set; } - public string Id { get; set; } + public long CdkeyId { get; set; } } /// - /// 中继CDKEY + /// 中继CDKEY存储 /// - public sealed partial class RelayServerCdkeyInfo + public sealed partial class RelayServerCdkeyStoreInfo : RelayServerCdkeyInfo { public string Id { get; set; } @@ -72,21 +95,17 @@ /// public DateTime EndTime { get; set; } /// + /// 最后使用时间 + /// + public DateTime UseTime { get; set; } + /// /// 允许节点 /// public List Nodes { get; set; } /// - /// 带宽Mbps - /// - public double Bandwidth { get; set; } - /// /// 流量 /// - public ulong MaxBytes { get; set; } - /// - /// 剩余流量 - /// - public ulong LastBytes { get; set; } + public long MaxBytes { get; set; } /// /// 原价 diff --git a/src/linker.messenger.relay/server/IRelayServerNodeStore.cs b/src/linker.messenger.relay/server/IRelayServerNodeStore.cs index 7890e39e..38bd48bb 100644 --- a/src/linker.messenger.relay/server/IRelayServerNodeStore.cs +++ b/src/linker.messenger.relay/server/IRelayServerNodeStore.cs @@ -33,7 +33,7 @@ namespace linker.messenger.relay.server /// 设置剩余流量 /// /// - public void SetMaxGbTotalLastBytes(ulong value); + public void SetMaxGbTotalLastBytes(long value); /// /// 提交保存 /// @@ -68,7 +68,7 @@ namespace linker.messenger.relay.server public double MaxBandwidth { get; set; } public double MaxBandwidthTotal { get; set; } public double MaxGbTotal { get; set; } - public ulong MaxGbTotalLastBytes { get; set; } + public long MaxGbTotalLastBytes { get; set; } public int MaxGbTotalMonth { get; set; } public bool Public { get; set; } @@ -79,8 +79,6 @@ namespace linker.messenger.relay.server #else public string MasterSecretKey { get; set; } = string.Empty; #endif - - public List UserIds { get; set; } = new List(); } public sealed partial class RelayServerNodeReportInfo @@ -92,7 +90,7 @@ namespace linker.messenger.relay.server public double MaxBandwidth { get; set; } public double MaxBandwidthTotal { get; set; } public double MaxGbTotal { get; set; } - public ulong MaxGbTotalLastBytes { get; set; } + public long MaxGbTotalLastBytes { get; set; } public double ConnectionRatio { get; set; } public double BandwidthRatio { get; set; } @@ -104,8 +102,6 @@ namespace linker.messenger.relay.server public IPEndPoint EndPoint { get; set; } public long LastTicks { get; set; } - - public List UserIds { get; set; } = new List(); } diff --git a/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs b/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs index c1494754..834a6d2a 100644 --- a/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs +++ b/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs @@ -13,14 +13,17 @@ namespace linker.messenger.relay.server private ulong relayFlowingId = 0; private readonly ConcurrentDictionary reports = new ConcurrentDictionary(); - + private readonly ConcurrentQueue> trafficQueue = new ConcurrentQueue>(); private readonly IRelayServerCaching relayCaching; private readonly ISerializer serializer; - public RelayServerMasterTransfer(IRelayServerCaching relayCaching, ISerializer serializer, IRelayServerMasterStore relayServerMasterStore) + private readonly IRelayServerCdkeyStore relayServerCdkeyStore; + public RelayServerMasterTransfer(IRelayServerCaching relayCaching, ISerializer serializer, IRelayServerMasterStore relayServerMasterStore, IRelayServerCdkeyStore relayServerCdkeyStore) { this.relayCaching = relayCaching; this.serializer = serializer; + this.relayServerCdkeyStore = relayServerCdkeyStore; + TrafficTask(); } @@ -82,10 +85,10 @@ namespace linker.messenger.relay.server /// /// 是否已认证 /// - public List GetNodes(bool validated, string userid) + public List GetNodes(bool validated) { var result = reports.Values - .Where(c => c.Public || (c.Public == false && validated) || c.UserIds.Contains(userid)) + .Where(c => c.Public || validated) .Where(c => Environment.TickCount64 - c.LastTicks < 15000) .Where(c => c.ConnectionRatio < 100 && (c.MaxGbTotal == 0 || (c.MaxGbTotal > 0 && c.MaxGbTotalLastBytes > 0))) .OrderByDescending(c => c.LastTicks); @@ -96,7 +99,7 @@ namespace linker.messenger.relay.server .ThenByDescending(x => x.MaxBandwidth == 0 ? double.MaxValue : x.MaxBandwidth) .ThenByDescending(x => x.MaxBandwidthTotal == 0 ? double.MaxValue : x.MaxBandwidthTotal) .ThenByDescending(x => x.MaxGbTotal == 0 ? double.MaxValue : x.MaxGbTotal) - .ThenByDescending(x => x.MaxGbTotalLastBytes == 0 ? ulong.MaxValue : x.MaxGbTotalLastBytes) + .ThenByDescending(x => x.MaxGbTotalLastBytes == 0 ? long.MaxValue : x.MaxGbTotalLastBytes) .ToList(); } @@ -109,7 +112,29 @@ namespace linker.messenger.relay.server { return reports.TryGetValue(nodeId, out RelayServerNodeReportInfo relayNodeReportInfo) && relayNodeReportInfo.Public == false; } + + + public async Task> AddTraffic(RelayTrafficUpdateInfo relayTrafficUpdateInfo) + { + if (relayTrafficUpdateInfo.Dic.Count > 0) + trafficQueue.Enqueue(relayTrafficUpdateInfo.Dic); + + if (relayTrafficUpdateInfo.Ids == null || relayTrafficUpdateInfo.Ids.Count == 0) + { + return new Dictionary(); + } + return (await relayServerCdkeyStore.Get(relayTrafficUpdateInfo.Ids)).ToDictionary(c => c.CdkeyId, c => c.LastBytes); + } + private void TrafficTask() + { + TimerHelper.SetIntervalLong(async () => + { + while (trafficQueue.TryDequeue(out Dictionary dic)) + { + await relayServerCdkeyStore.Traffic(dic).ConfigureAwait(false); + } + return true; + },3000); + } } - - } diff --git a/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs b/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs index 3c448489..be0d78ca 100644 --- a/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs +++ b/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs @@ -5,7 +5,6 @@ using System.Buffers; using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; -using System.Runtime.CompilerServices; namespace linker.messenger.relay.server { @@ -18,11 +17,11 @@ namespace linker.messenger.relay.server private IConnection localConnection; private IConnection remoteConnection; - private ulong bytes = 0; - private ulong lastBytes = 0; - RelaySpeedLimit limitTotal = new RelaySpeedLimit(); + private long bytes = 0; + private long lastBytes = 0; + private RelaySpeedLimit limitTotal = new RelaySpeedLimit(); private readonly ConcurrentDictionary trafficDict = new ConcurrentDictionary(); - private readonly ConcurrentDictionary cdkeyLastBytes = new ConcurrentDictionary(); + private readonly ConcurrentDictionary cdkeyLastBytes = new ConcurrentDictionary(); private readonly ISerializer serializer; private readonly IRelayServerNodeStore relayServerNodeStore; @@ -50,7 +49,7 @@ namespace linker.messenger.relay.server { try { - IConnection connection = nodeid == RelayServerNodeInfo.MASTER_NODE_ID ? localConnection : remoteConnection; + IConnection connection = relayServerNodeStore.Node.Id == RelayServerNodeInfo.MASTER_NODE_ID ? localConnection : remoteConnection; MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { @@ -133,6 +132,7 @@ namespace linker.messenger.relay.server public bool NeedLimit(RelayTrafficCacheInfo relayCache) { if (relayCache.Cache.Validated) return false; + //if (relayCache.CurrentCdkey != null) return false; return limitTotal.NeedLimit(); } /// @@ -164,7 +164,7 @@ namespace linker.messenger.relay.server trafficDict.TryRemove(relayCache.Cache.FlowId, out _); foreach (var item in relayCache.Cache.Cdkey) { - cdkeyLastBytes.TryRemove(item.Id, out _); + cdkeyLastBytes.TryRemove(item.CdkeyId, out _); } } /// @@ -172,7 +172,7 @@ namespace linker.messenger.relay.server /// /// /// - public bool AddBytes(RelayTrafficCacheInfo cache, ulong length) + public bool AddBytes(RelayTrafficCacheInfo cache, long length) { Interlocked.Add(ref bytes, length); @@ -194,20 +194,13 @@ namespace linker.messenger.relay.server /// private void SetLimit(RelayTrafficCacheInfo relayCache) { - //验证过的,无限制 - if (relayCache.Cache.Validated) + //无限制 + if (relayCache.Cache.Validated || relayServerNodeStore.Node.MaxBandwidth == 0) { relayCache.Limit.SetLimit(0); return; } - //节点无限制 - if (relayServerNodeStore.Node.MaxBandwidth == 0) - { - relayCache.Limit.SetLimit((uint)Math.Ceiling((relayServerNodeStore.Node.MaxBandwidth * 1024 * 1024) / 8.0)); - return; - } - RelayServerCdkeyInfo currentCdkey = relayCache.Cache.Cdkey.Where(c => c.LastBytes > 0).OrderByDescending(c => c.Bandwidth).FirstOrDefault(); //有cdkey,且带宽大于节点带宽,就用cdkey的带宽 if (currentCdkey != null && (currentCdkey.Bandwidth == 0 || currentCdkey.Bandwidth > relayServerNodeStore.Node.MaxBandwidth)) @@ -220,91 +213,129 @@ namespace linker.messenger.relay.server relayCache.Limit.SetLimit((uint)Math.Ceiling((relayServerNodeStore.Node.MaxBandwidth * 1024 * 1024) / 8.0)); } - private void ResetNodeBytes(ulong length) + private void ResetNodeBytes() { - if (relayServerNodeStore.Node.MaxGbTotalLastBytes >= length) - relayServerNodeStore.SetMaxGbTotalLastBytes(relayServerNodeStore.Node.MaxGbTotalLastBytes - length); - else relayServerNodeStore.SetMaxGbTotalLastBytes(0); - + foreach (var cache in trafficDict.Values.Where(c => c.CurrentCdkey == null)) + { + long length = cache.Sendt; + Interlocked.Exchange(ref cache.Sendt, 0); + if (relayServerNodeStore.Node.MaxGbTotalLastBytes >= length) + relayServerNodeStore.SetMaxGbTotalLastBytes(relayServerNodeStore.Node.MaxGbTotalLastBytes - length); + else relayServerNodeStore.SetMaxGbTotalLastBytes(0); + } if (relayServerNodeStore.Node.MaxGbTotalMonth != DateTime.Now.Month) { relayServerNodeStore.SetMaxGbTotalMonth(DateTime.Now.Month); - relayServerNodeStore.SetMaxGbTotalLastBytes((ulong)(relayServerNodeStore.Node.MaxGbTotal * 1024 * 1024 * 1024)); + relayServerNodeStore.SetMaxGbTotalLastBytes((long)(relayServerNodeStore.Node.MaxGbTotal * 1024 * 1024 * 1024)); } relayServerNodeStore.Confirm(); } - private void TrafficTask() + private void DownloadBytes() { - TimerHelper.SetInterval(async () => + TimerHelper.Async(async () => { - //需要报告Cdkey的流量 - _ = messengerSender.SendReply(new MessageRequestWrap + List ids = trafficDict.Values.SelectMany(c => c.Cache.Cdkey).Select(c => c.CdkeyId).Distinct().ToList(); + while (ids.Count > 0) + { + //分批更新,可能数量很大 + List id = ids.Take(100).ToList(); + ids.RemoveRange(0, id.Count); + + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = relayServerNodeStore.Node.Id == RelayServerNodeInfo.MASTER_NODE_ID ? localConnection : remoteConnection, + MessengerId = (ushort)RelayMessengerIds.TrafficReport, + Payload = serializer.Serialize(new RelayTrafficUpdateInfo + { + Dic = [], + Ids = id, + SecretKey = relayServerNodeStore.Node.Id == RelayServerNodeInfo.MASTER_NODE_ID + ? relayServerMasterStore.Master.SecretKey + : relayServerNodeStore.Node.MasterSecretKey + }), + Timeout = 4000 + }); + + if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) + { + Dictionary dic = serializer.Deserialize>(resp.Data.Span); + //更新剩余流量 + foreach (KeyValuePair item in dic) + { + cdkeyLastBytes.AddOrUpdate(item.Key, item.Value, (a, b) => item.Value); + } + //查不到的,归零 + foreach (long item in id.Except(dic.Keys)) + { + cdkeyLastBytes.AddOrUpdate(item, 0, (a, b) => 0); + } + } + } + }); + } + private void UploadBytes() + { + TimerHelper.Async(async () => + { + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = relayServerNodeStore.Node.Id == RelayServerNodeInfo.MASTER_NODE_ID ? localConnection : remoteConnection, MessengerId = (ushort)RelayMessengerIds.TrafficReport, - Payload = serializer.Serialize(new RelayTrafficReportInfo + Payload = serializer.Serialize(new RelayTrafficUpdateInfo { - Id2Bytes = trafficDict.Values - .Where(c => c.CurrentCdkey != null && c.Sendt > 0) - .GroupBy(c => c.CurrentCdkey.Id) - .ToDictionary(c => c.Key, d => (ulong)d.Sum(d => (decimal)d.Sendt)), - UpdateIds = trafficDict.Values.SelectMany(c => c.Cache.Cdkey).Select(c => c.Id).Distinct().ToList(), + Dic = trafficDict.Values.Where(c => c.CurrentCdkey != null && c.Sendt > 0).GroupBy(c => c.CurrentCdkey.CdkeyId).ToDictionary(c => c.Key, d => d.Sum(d => d.Sendt)), + Ids = [], SecretKey = relayServerNodeStore.Node.Id == RelayServerNodeInfo.MASTER_NODE_ID - ? relayServerMasterStore.Master.SecretKey - : relayServerNodeStore.Node.MasterSecretKey + ? relayServerMasterStore.Master.SecretKey + : relayServerNodeStore.Node.MasterSecretKey }), - Timeout = 4000, - - }).ContinueWith((result) => - { - //更新cdkey的剩余流量 - if (result.Result.Code != MessageResponeCodes.OK || result.Result.Data.Length == 0) - { - return; - } - Dictionary dic = serializer.Deserialize>(result.Result.Data.Span); - foreach (var item in dic) - { - cdkeyLastBytes.AddOrUpdate(item.Key, item.Value, (a, b) => item.Value); - } + Timeout = 4000 }); - foreach (var cache in trafficDict.Values.Where(c => c.CurrentCdkey != null)) + if (resp.Code == MessageResponeCodes.OK) { - ulong length = cache.Sendt; - Interlocked.Add(ref Unsafe.As(ref cache.Sendt), -(long)length); - - if (cdkeyLastBytes.TryGetValue(cache.CurrentCdkey.Id, out ulong value)) + try { - cache.CurrentCdkey.LastBytes = value; + serializer.Deserialize>(resp.Data.Span); + //成功报告了流量,就重新计数 + foreach (var cache in trafficDict.Values.Where(c => c.CurrentCdkey != null)) + { + Interlocked.Exchange(ref cache.Sendt, 0); + //检查一下是不是需要更新剩余流量 + if (cdkeyLastBytes.TryGetValue(cache.CurrentCdkey.CdkeyId, out long value)) + { + cache.CurrentCdkey.LastBytes = value; + } + //当前cdkey流量用完了,就重新找找新的cdkey + if (cache.CurrentCdkey.LastBytes <= 0) + { + SetLimit(cache); + } + } } - if (cache.CurrentCdkey.LastBytes <= 0) + catch (Exception) { - SetLimit(cache); } } + }); + } + private void TrafficTask() + { + TimerHelper.SetIntervalLong(() => + { + UploadBytes(); + DownloadBytes(); - foreach (var cache in trafficDict.Values.Where(c => c.CurrentCdkey == null)) - { - ulong length = cache.Sendt; - Interlocked.Add(ref Unsafe.As(ref cache.Sendt), -(long)length); - ResetNodeBytes(length); - } - await Task.CompletedTask; + ResetNodeBytes(); return true; - }, () => 5000); + }, 5000); } private void ReportTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Debug($"relay report : {relayServerNodeStore.Node.ToJson()}"); - } - IEnumerable nodes = new List { //默认报告给自己,作为本服务器的一个默认中继节点 @@ -349,8 +380,7 @@ namespace linker.messenger.relay.server MaxGbTotalLastBytes = node.MaxGbTotalLastBytes, MaxConnection = node.MaxConnection, ConnectionRatio = Math.Round(node.MaxConnection == 0 ? 0 : connectionNum / 2.0 / node.MaxConnection, 2), - EndPoint = endPoint, - UserIds = node.UserIds + EndPoint = endPoint }; await messengerSender.SendOnly(new MessageRequestWrap @@ -364,17 +394,17 @@ namespace linker.messenger.relay.server { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { - LoggerHelper.Instance.Debug($"relay report : {ex}"); + LoggerHelper.Instance.Error($"relay report : {ex}"); } } } return true; - }, () => 5000); + }, 5000); } private void SignInTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { if ((remoteConnection == null || remoteConnection.Connected == false) && string.IsNullOrWhiteSpace(relayServerNodeStore.Node.MasterHost) == false) { @@ -385,7 +415,7 @@ namespace linker.messenger.relay.server localConnection = await SignIn(new IPEndPoint(IPAddress.Loopback, relayServerNodeStore.ServicePort).ToString(), relayServerMasterStore.Master.SecretKey).ConfigureAwait(false); } return true; - }, () => 3000); + }, 3000); } private async Task SignIn(string host, string secretKey) { @@ -403,10 +433,14 @@ namespace linker.messenger.relay.server Socket socket = new Socket(remote.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.KeepAlive(); await socket.ConnectAsync(remote).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false); - return await messengerResolver.BeginReceiveClient(socket, true, (byte)ResolverType.RelayReport, bytes).ConfigureAwait(false); + return await messengerResolver.BeginReceiveClient(socket, true, (byte)ResolverType.RelayReport, bytes.AsMemory(0, secretKeyBytes.Length + 1)).ConfigureAwait(false); } - catch (Exception) + catch (Exception ex) { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error(ex); + } } finally { @@ -416,16 +450,16 @@ namespace linker.messenger.relay.server } } - public sealed partial class RelayTrafficReportInfo + public sealed partial class RelayTrafficUpdateInfo { /// /// cdkey id 和 流量 /// - public Dictionary Id2Bytes { get; set; } + public Dictionary Dic { get; set; } /// /// 需要知道哪些cdkey的剩余流量 /// - public List UpdateIds { get; set; } + public List Ids { get; set; } public string SecretKey { get; set; } } diff --git a/src/linker.messenger.relay/server/RelayServerReportResolver.cs b/src/linker.messenger.relay/server/RelayServerReportResolver.cs index 7b8c7a87..c36f39b1 100644 --- a/src/linker.messenger.relay/server/RelayServerReportResolver.cs +++ b/src/linker.messenger.relay/server/RelayServerReportResolver.cs @@ -24,10 +24,10 @@ namespace linker.messenger.relay.server this.messengerResolver = messengerResolver; } - public virtual void AddReceive(ulong bytes) + public virtual void AddReceive(long bytes) { } - public virtual void AddSendt(ulong bytes) + public virtual void AddSendt(long bytes) { } @@ -36,19 +36,32 @@ namespace linker.messenger.relay.server byte[] buffer = ArrayPool.Shared.Rent(1024); try { - AddReceive((ulong)memory.Length); - int length = await socket.ReceiveAsync(buffer.AsMemory(0, 1), SocketFlags.None).ConfigureAwait(false); - AddReceive((ulong)length); + + + AddReceive(memory.Length); + await socket.ReceiveAsync(buffer.AsMemory(0, 1), SocketFlags.None).ConfigureAwait(false); + int length = buffer[0]; + AddReceive(length); await socket.ReceiveAsync(buffer.AsMemory(0, length), SocketFlags.None).ConfigureAwait(false); string key = buffer.AsMemory(0, length).GetString(); + if (relayServerMasterStore.Master.SecretKey.Md5() == key) { await messengerResolver.BeginReceiveServer(socket, Helper.EmptyArray); } + else + { + socket.SafeClose(); + } } - catch (Exception) + catch (Exception ex) { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error(ex); + } + socket.SafeClose(); } finally { diff --git a/src/linker.messenger.relay/server/RelayServerResolver.cs b/src/linker.messenger.relay/server/RelayServerResolver.cs index 872551de..1c9c7c35 100644 --- a/src/linker.messenger.relay/server/RelayServerResolver.cs +++ b/src/linker.messenger.relay/server/RelayServerResolver.cs @@ -26,16 +26,16 @@ namespace linker.messenger.relay.server - public virtual void AddReceive(string key, string from, string to, string groupid, ulong bytes) + public virtual void AddReceive(string key, string from, string to, string groupid, long bytes) { } - public virtual void AddSendt(string key, string from, string to, string groupid, ulong bytes) + public virtual void AddSendt(string key, string from, string to, string groupid, long bytes) { } - public virtual void AddReceive(string key, ulong bytes) + public virtual void AddReceive(string key, long bytes) { } - public virtual void AddSendt(string key, ulong bytes) + public virtual void AddSendt(string key, long bytes) { } @@ -75,7 +75,7 @@ namespace linker.messenger.relay.server } //流量统计 - AddReceive(relayCache.FromId, relayCache.FromName, relayCache.ToName, relayCache.GroupId, (ulong)length); + AddReceive(relayCache.FromId, relayCache.FromName, relayCache.ToName, relayCache.GroupId, length); try { switch (relayMessage.Type) @@ -152,7 +152,7 @@ namespace linker.messenger.relay.server while ((bytesRead = await source.ReceiveAsync(buffer.AsMemory(), SocketFlags.None).ConfigureAwait(false)) != 0) { //流量限制 - if (relayServerNodeTransfer.AddBytes(trafficCacheInfo, (ulong)bytesRead) == false) + if (relayServerNodeTransfer.AddBytes(trafficCacheInfo, bytesRead) == false) { source.SafeClose(); break; @@ -181,8 +181,8 @@ namespace linker.messenger.relay.server } } - AddReceive(cache.FromId, cache.FromName, cache.ToName, cache.GroupId, (ulong)bytesRead); - AddSendt(cache.FromId, cache.FromName, cache.ToName, cache.GroupId, (ulong)bytesRead); + AddReceive(cache.FromId, cache.FromName, cache.ToName, cache.GroupId, bytesRead); + AddSendt(cache.FromId, cache.FromName, cache.ToName, cache.GroupId, bytesRead); await destination.SendAsync(buffer.AsMemory(0, bytesRead), SocketFlags.None).ConfigureAwait(false); } } @@ -263,11 +263,24 @@ namespace linker.messenger.relay.server } public sealed class RelayTrafficCacheInfo { - public ulong Sendt; + public long Sendt; public RelaySpeedLimit Limit { get; set; } public RelayCacheInfo Cache { get; set; } public RelayServerCdkeyInfo CurrentCdkey { get; set; } } + public partial class RelayServerCdkeyInfo + { + public long CdkeyId { get; set; } + /// + /// 带宽Mbps + /// + public double Bandwidth { get; set; } + /// + /// 剩余流量 + /// + public long LastBytes { get; set; } + } + public sealed class RelayWrapInfo { diff --git a/src/linker.messenger.serializer.memorypack/Entry.cs b/src/linker.messenger.serializer.memorypack/Entry.cs index cfeed455..c83a0c59 100644 --- a/src/linker.messenger.serializer.memorypack/Entry.cs +++ b/src/linker.messenger.serializer.memorypack/Entry.cs @@ -56,6 +56,7 @@ namespace linker.messenger.serializer.memorypack MemoryPackFormatterProvider.Register(new RelayCacheInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayMessageInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerCdkeyInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayServerCdkeyStoreInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerCdkeyPageRequestInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerCdkeyPageResultInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerCdkeyAddInfoFormatter()); diff --git a/src/linker.messenger.serializer.memorypack/FlowSerializer.cs b/src/linker.messenger.serializer.memorypack/FlowSerializer.cs index 33f3da21..31783f78 100644 --- a/src/linker.messenger.serializer.memorypack/FlowSerializer.cs +++ b/src/linker.messenger.serializer.memorypack/FlowSerializer.cs @@ -11,13 +11,13 @@ namespace linker.messenger.serializer.memorypack public readonly FlowItemInfo info; [MemoryPackInclude] - ulong ReceiveBytes => info.ReceiveBytes; + long ReceiveBytes => info.ReceiveBytes; [MemoryPackInclude] - ulong SendtBytes => info.SendtBytes; + long SendtBytes => info.SendtBytes; [MemoryPackConstructor] - SerializableFlowItemInfo(ulong receiveBytes, ulong sendtBytes) + SerializableFlowItemInfo(long receiveBytes, long sendtBytes) { var info = new FlowItemInfo { ReceiveBytes = receiveBytes, SendtBytes = sendtBytes }; this.info = info; @@ -181,16 +181,16 @@ namespace linker.messenger.serializer.memorypack public readonly RelayFlowItemInfo info; [MemoryPackInclude] - ulong ReceiveBytes => info.ReceiveBytes; + long ReceiveBytes => info.ReceiveBytes; [MemoryPackInclude] - ulong SendtBytes => info.SendtBytes; + long SendtBytes => info.SendtBytes; [MemoryPackInclude] - ulong DiffReceiveBytes => info.DiffReceiveBytes; + long DiffReceiveBytes => info.DiffReceiveBytes; [MemoryPackInclude] - ulong DiffSendtBytes => info.DiffSendtBytes; + long DiffSendtBytes => info.DiffSendtBytes; [MemoryPackInclude] string FromName => info.FromName; @@ -199,7 +199,7 @@ namespace linker.messenger.serializer.memorypack string ToName => info.ToName; [MemoryPackConstructor] - SerializableRelayFlowItemInfo(ulong receiveBytes, ulong sendtBytes, ulong diffReceiveBytes, ulong diffSendtBytes, string fromName, string toName) + SerializableRelayFlowItemInfo(long receiveBytes, long sendtBytes, long diffReceiveBytes, long diffSendtBytes, string fromName, string toName) { var info = new RelayFlowItemInfo { @@ -393,22 +393,22 @@ namespace linker.messenger.serializer.memorypack public readonly SForwardFlowItemInfo info; [MemoryPackInclude] - ulong ReceiveBytes => info.ReceiveBytes; + long ReceiveBytes => info.ReceiveBytes; [MemoryPackInclude] - ulong SendtBytes => info.SendtBytes; + long SendtBytes => info.SendtBytes; [MemoryPackInclude] - ulong DiffReceiveBytes => info.DiffReceiveBytes; + long DiffReceiveBytes => info.DiffReceiveBytes; [MemoryPackInclude] - ulong DiffSendtBytes => info.DiffSendtBytes; + long DiffSendtBytes => info.DiffSendtBytes; [MemoryPackInclude] string Key => info.Key; [MemoryPackConstructor] - SerializableSForwardFlowItemInfo(ulong receiveBytes, ulong sendtBytes, ulong diffReceiveBytes, ulong diffSendtBytes, string key) + SerializableSForwardFlowItemInfo(long receiveBytes, long sendtBytes, long diffReceiveBytes, long diffSendtBytes, string key) { var info = new SForwardFlowItemInfo { diff --git a/src/linker.messenger.serializer.memorypack/ForwardSerializer.cs b/src/linker.messenger.serializer.memorypack/ForwardSerializer.cs index 56c949a5..da566b14 100644 --- a/src/linker.messenger.serializer.memorypack/ForwardSerializer.cs +++ b/src/linker.messenger.serializer.memorypack/ForwardSerializer.cs @@ -11,7 +11,7 @@ namespace linker.messenger.serializer.memorypack public readonly ForwardInfo info; [MemoryPackInclude] - uint Id => info.Id; + long Id => info.Id; [MemoryPackInclude] string Name => info.Name; @@ -47,7 +47,7 @@ namespace linker.messenger.serializer.memorypack string TargetMsg => info.TargetMsg; [MemoryPackConstructor] - SerializableForwardInfo(uint id, string name, string machineId, string groupId, string machineName, IPAddress bindIPAddress, int port, IPEndPoint targetEP, bool started, byte bufferSize, string msg, string targetMsg) + SerializableForwardInfo(long id, string name, string machineId, string groupId, string machineName, IPAddress bindIPAddress, int port, IPEndPoint targetEP, bool started, byte bufferSize, string msg, string targetMsg) { this.info = new ForwardInfo { @@ -167,10 +167,10 @@ namespace linker.messenger.serializer.memorypack string MachineId => info.MachineId; [MemoryPackInclude, MemoryPackAllowSerialize] - uint Id => info.Id; + long Id => info.Id; [MemoryPackConstructor] - SerializableForwardRemoveForwardInfo(string machineId, uint id) + SerializableForwardRemoveForwardInfo(string machineId, long id) { this.info = new ForwardRemoveForwardInfo { diff --git a/src/linker.messenger.serializer.memorypack/RelaySerializer.cs b/src/linker.messenger.serializer.memorypack/RelaySerializer.cs index 86968b1e..80d41cd4 100644 --- a/src/linker.messenger.serializer.memorypack/RelaySerializer.cs +++ b/src/linker.messenger.serializer.memorypack/RelaySerializer.cs @@ -171,7 +171,7 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] double MaxGbTotal => info.MaxGbTotal; [MemoryPackInclude] - ulong MaxGbTotalLastBytes => info.MaxGbTotalLastBytes; + long MaxGbTotalLastBytes => info.MaxGbTotalLastBytes; [MemoryPackInclude] double ConnectionRatio => info.ConnectionRatio; [MemoryPackInclude] @@ -185,18 +185,15 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] long LastTicks => info.LastTicks; - [MemoryPackInclude] - List UserIds => info.UserIds; - [MemoryPackConstructor] SerializableRelayServerNodeReportInfo( string id, string name, int maxConnection, double maxBandwidth, double maxBandwidthTotal, - double maxGbTotal, ulong maxGbTotalLastBytes, + double maxGbTotal, long maxGbTotalLastBytes, double connectionRatio, double bandwidthRatio, bool Public, int delay, - IPEndPoint endPoint, long lastTicks, List userIds) + IPEndPoint endPoint, long lastTicks) { var info = new RelayServerNodeReportInfo { @@ -212,8 +209,7 @@ namespace linker.messenger.serializer.memorypack MaxGbTotal = maxGbTotal, MaxGbTotalLastBytes = maxGbTotalLastBytes, Name = name, - Public = Public, - UserIds = userIds + Public = Public }; this.info = info; } @@ -447,7 +443,6 @@ namespace linker.messenger.serializer.memorypack } } - [MemoryPackable] public readonly partial struct SerializableRelayServerCdkeyInfo { @@ -455,53 +450,21 @@ namespace linker.messenger.serializer.memorypack public readonly RelayServerCdkeyInfo info; [MemoryPackInclude] - string Id => info.Id; - [MemoryPackInclude] - string UserId => info.UserId; + long CdkeyId => info.CdkeyId; - - [MemoryPackInclude] - string CdKey => info.CdKey; - [MemoryPackInclude] - DateTime AddTime => info.AddTime; - [MemoryPackInclude] - DateTime StartTime => info.StartTime; - [MemoryPackInclude] - DateTime EndTime => info.EndTime; - [MemoryPackInclude] - List Nodes => info.Nodes; [MemoryPackInclude] double Bandwidth => info.Bandwidth; [MemoryPackInclude] - ulong MaxBytes => info.MaxBytes; - [MemoryPackInclude] - ulong LastBytes => info.LastBytes; - [MemoryPackInclude] - double Memory => info.Memory; - [MemoryPackInclude] - double PayMemory => info.PayMemory; - [MemoryPackInclude] - string Remark => info.Remark; + long LastBytes => info.LastBytes; [MemoryPackConstructor] - SerializableRelayServerCdkeyInfo(string id, string userid, string cdKey, DateTime addTime, DateTime startTime, DateTime endTime, - List nodes, double bandwidth, ulong maxBytes, ulong lastBytes, double memory, double payMemory, string remark) + SerializableRelayServerCdkeyInfo(long cdkeyid, double bandwidth, long lastBytes) { var info = new RelayServerCdkeyInfo { - Id = id, - UserId = userid, - CdKey = cdKey, - AddTime = addTime, - StartTime = startTime, - EndTime = endTime, - Nodes = nodes, + CdkeyId = cdkeyid, Bandwidth = bandwidth, - MaxBytes = maxBytes, - LastBytes = lastBytes, - Memory = memory, - PayMemory = payMemory, - Remark = remark + LastBytes = lastBytes }; this.info = info; } @@ -539,6 +502,103 @@ namespace linker.messenger.serializer.memorypack } + [MemoryPackable] + public readonly partial struct SerializableRelayServerCdkeyStoreInfo + { + [MemoryPackIgnore] + public readonly RelayServerCdkeyStoreInfo info; + + [MemoryPackInclude] + long CdkeyId => info.CdkeyId; + [MemoryPackInclude] + string Id => info.Id; + [MemoryPackInclude] + string UserId => info.UserId; + + + [MemoryPackInclude] + string CdKey => info.CdKey; + [MemoryPackInclude] + DateTime AddTime => info.AddTime; + [MemoryPackInclude] + DateTime StartTime => info.StartTime; + [MemoryPackInclude] + DateTime EndTime => info.EndTime; + [MemoryPackInclude] + DateTime UseTime => info.UseTime; + [MemoryPackInclude] + List Nodes => info.Nodes; + [MemoryPackInclude] + double Bandwidth => info.Bandwidth; + [MemoryPackInclude] + long MaxBytes => info.MaxBytes; + [MemoryPackInclude] + long LastBytes => info.LastBytes; + [MemoryPackInclude] + double Memory => info.Memory; + [MemoryPackInclude] + double PayMemory => info.PayMemory; + [MemoryPackInclude] + string Remark => info.Remark; + + [MemoryPackConstructor] + SerializableRelayServerCdkeyStoreInfo(long cdkeyid, string id, string userid, string cdKey, DateTime addTime, DateTime startTime, DateTime endTime, DateTime useTime, + List nodes, double bandwidth, long maxBytes, long lastBytes, double memory, double payMemory, string remark) + { + var info = new RelayServerCdkeyStoreInfo + { + CdkeyId = cdkeyid, + Id = id, + UserId = userid, + CdKey = cdKey, + AddTime = addTime, + StartTime = startTime, + EndTime = endTime, + UseTime = useTime, + Nodes = nodes, + Bandwidth = bandwidth, + MaxBytes = maxBytes, + LastBytes = lastBytes, + Memory = memory, + PayMemory = payMemory, + Remark = remark + }; + this.info = info; + } + + public SerializableRelayServerCdkeyStoreInfo(RelayServerCdkeyStoreInfo info) + { + this.info = info; + } + } + public class RelayServerCdkeyStoreInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayServerCdkeyStoreInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableRelayServerCdkeyStoreInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyStoreInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + [MemoryPackable] public readonly partial struct SerializableRelayServerCdkeyAddInfo @@ -549,10 +609,10 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] string SecretKey => info.SecretKey; [MemoryPackInclude, MemoryPackAllowSerialize] - RelayServerCdkeyInfo Data => info.Data; + RelayServerCdkeyStoreInfo Data => info.Data; [MemoryPackConstructor] - SerializableRelayServerCdkeyAddInfo(string secretKey, RelayServerCdkeyInfo data) + SerializableRelayServerCdkeyAddInfo(string secretKey, RelayServerCdkeyStoreInfo data) { var info = new RelayServerCdkeyAddInfo { @@ -604,15 +664,15 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] string SecretKey => info.SecretKey; [MemoryPackInclude] - string Id => info.Id; + long CdkeyId => info.CdkeyId; [MemoryPackConstructor] - SerializableRelayServerCdkeyDelInfo(string secretKey, string id) + SerializableRelayServerCdkeyDelInfo(string secretKey, long cdkeyid) { var info = new RelayServerCdkeyDelInfo { SecretKey = secretKey, - Id = id + CdkeyId = cdkeyid }; this.info = info; } @@ -735,10 +795,10 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] int Count => info.Count; [MemoryPackInclude] - List List => info.List; + List List => info.List; [MemoryPackConstructor] - SerializableRelayServerCdkeyPageResultInfo(int page, int size, int count, List list) + SerializableRelayServerCdkeyPageResultInfo(int page, int size, int count, List list) { var info = new RelayServerCdkeyPageResultInfo { @@ -788,35 +848,35 @@ namespace linker.messenger.serializer.memorypack public readonly partial struct SerializableRelayTrafficReportInfo { [MemoryPackIgnore] - public readonly RelayTrafficReportInfo info; + public readonly RelayTrafficUpdateInfo info; [MemoryPackInclude] - Dictionary Id2Bytes => info.Id2Bytes; + Dictionary Dic => info.Dic; [MemoryPackInclude] - List UpdateIds => info.UpdateIds; + List Ids => info.Ids; [MemoryPackInclude] string SecretKey => info.SecretKey; [MemoryPackConstructor] - SerializableRelayTrafficReportInfo(Dictionary id2Bytes, List updateIds, string secretKey) + SerializableRelayTrafficReportInfo(Dictionary dic, List ids, string secretKey) { - var info = new RelayTrafficReportInfo + var info = new RelayTrafficUpdateInfo { - Id2Bytes = id2Bytes, - UpdateIds = updateIds, + Dic = dic, + Ids = ids, SecretKey = secretKey }; this.info = info; } - public SerializableRelayTrafficReportInfo(RelayTrafficReportInfo info) + public SerializableRelayTrafficReportInfo(RelayTrafficUpdateInfo info) { this.info = info; } } - public class RelayTrafficReportInfoFormatter : MemoryPackFormatter + public class RelayTrafficReportInfoFormatter : MemoryPackFormatter { - public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayTrafficReportInfo value) + public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayTrafficUpdateInfo value) { if (value == null) { @@ -827,7 +887,7 @@ namespace linker.messenger.serializer.memorypack writer.WritePackable(new SerializableRelayTrafficReportInfo(value)); } - public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayTrafficReportInfo value) + public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayTrafficUpdateInfo value) { if (reader.PeekIsNull()) { diff --git a/src/linker.messenger.serializer.memorypack/SForwardSerializer.cs b/src/linker.messenger.serializer.memorypack/SForwardSerializer.cs index 17d90055..56725aae 100644 --- a/src/linker.messenger.serializer.memorypack/SForwardSerializer.cs +++ b/src/linker.messenger.serializer.memorypack/SForwardSerializer.cs @@ -11,7 +11,7 @@ namespace linker.messenger.serializer.memorypack public readonly SForwardInfo info; [MemoryPackInclude] - uint Id => info.Id; + long Id => info.Id; [MemoryPackInclude] string Name => info.Name; @@ -44,7 +44,7 @@ namespace linker.messenger.serializer.memorypack int RemotePortMax => info.RemotePortMax; [MemoryPackConstructor] - SerializableSForwardInfo(uint id, string name, string domain, int remotePort, byte bufferSize, IPEndPoint localEP, bool started, string msg, string localMsg, int remotePortMin, int remotePortMax) + SerializableSForwardInfo(long id, string name, string domain, int remotePort, byte bufferSize, IPEndPoint localEP, bool started, string msg, string localMsg, int remotePortMin, int remotePortMax) { this.info = new SForwardInfo { @@ -277,10 +277,10 @@ namespace linker.messenger.serializer.memorypack string MachineId => info.MachineId; [MemoryPackInclude, MemoryPackAllowSerialize] - uint Id => info.Id; + long Id => info.Id; [MemoryPackConstructor] - SerializableSForwardRemoveForwardInfo(string machineId, uint id) + SerializableSForwardRemoveForwardInfo(string machineId, long id) { this.info = new SForwardRemoveForwardInfo { diff --git a/src/linker.messenger.sforward/Config.cs b/src/linker.messenger.sforward/Config.cs index 5ef0a268..893c962a 100644 --- a/src/linker.messenger.sforward/Config.cs +++ b/src/linker.messenger.sforward/Config.cs @@ -10,7 +10,7 @@ namespace linker.messenger.sforward /// /// 穿透id /// - public uint Id { get; set; } + public long Id { get; set; } /// /// 名称 /// @@ -125,7 +125,7 @@ namespace linker.messenger.sforward public sealed partial class SForwardRemoveForwardInfo { public string MachineId { get; set; } - public uint Id { get; set; } + public long Id { get; set; } } /// diff --git a/src/linker.messenger.sforward/client/ISForwardClientStore.cs b/src/linker.messenger.sforward/client/ISForwardClientStore.cs index 6a8ba9b1..10e3b752 100644 --- a/src/linker.messenger.sforward/client/ISForwardClientStore.cs +++ b/src/linker.messenger.sforward/client/ISForwardClientStore.cs @@ -30,7 +30,7 @@ /// /// /// - public SForwardInfo Get(uint id); + public SForwardInfo Get(long id); /// /// 获取穿透 /// @@ -60,7 +60,7 @@ /// /// /// - public bool Remove(uint id); + public bool Remove(long id); /// /// 提交保存 /// diff --git a/src/linker.messenger.sforward/client/SForwardClientTransfer.cs b/src/linker.messenger.sforward/client/SForwardClientTransfer.cs index e1ac275d..90d79036 100644 --- a/src/linker.messenger.sforward/client/SForwardClientTransfer.cs +++ b/src/linker.messenger.sforward/client/SForwardClientTransfer.cs @@ -16,9 +16,6 @@ namespace linker.messenger.sforward.client private readonly ISForwardClientStore sForwardClientStore; private readonly ISerializer serializer; - private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); - - public SForwardClientTransfer(SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore, ISForwardClientStore sForwardClientStore, ISerializer serializer) { this.signInClientState = signInClientState; @@ -33,8 +30,6 @@ namespace linker.messenger.sforward.client private void Start() { var list = sForwardClientStore.Get(); - uint maxid = list.Count > 0 ? list.Max(c => c.Id) : 1; - ns.Reset(maxid); foreach (var item in list) { @@ -167,7 +162,6 @@ namespace linker.messenger.sforward.client } else { - forwardInfo.Id = ns.Increment(); if (PortRange(forwardInfo.Domain, out int min, out int max)) { forwardInfo.RemotePortMin = min; @@ -183,7 +177,7 @@ namespace linker.messenger.sforward.client return true; } - public bool Remove(uint id) + public bool Remove(long id) { //同名或者同端口,但是ID不一样 SForwardInfo old = sForwardClientStore.Get(id); diff --git a/src/linker.messenger.sforward/proxy/SForwardProxy.cs b/src/linker.messenger.sforward/proxy/SForwardProxy.cs index 1752d312..0701851a 100644 --- a/src/linker.messenger.sforward/proxy/SForwardProxy.cs +++ b/src/linker.messenger.sforward/proxy/SForwardProxy.cs @@ -14,10 +14,10 @@ namespace linker.plugins.sforward.proxy } - public virtual void AddReceive(string key,string groupid, ulong bytes) + public virtual void AddReceive(string key,string groupid, long bytes) { } - public virtual void AddSendt(string key,string groupid, ulong bytes) + public virtual void AddSendt(string key,string groupid, long bytes) { } diff --git a/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs b/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs index 0c11ffb9..d744f506 100644 --- a/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs +++ b/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs @@ -281,13 +281,13 @@ namespace linker.plugins.sforward.proxy { if (isDomain) { - AddReceive(domain, groupid, (ulong)bytesRead); - AddSendt(domain, groupid, (ulong)bytesRead); + AddReceive(domain, groupid, bytesRead); + AddSendt(domain, groupid, bytesRead); } else { - AddReceive(portStr, groupid, (ulong)bytesRead); - AddSendt(portStr, groupid, (ulong)bytesRead); + AddReceive(portStr, groupid, bytesRead); + AddSendt(portStr, groupid, bytesRead); } await target.SendAsync(buffer.Slice(0, bytesRead), SocketFlags.None).ConfigureAwait(false); } diff --git a/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs b/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs index e5dabd14..fb0d0988 100644 --- a/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs +++ b/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs @@ -59,13 +59,13 @@ namespace linker.plugins.sforward.proxy Memory memory = buffer.AsMemory(0, result.ReceivedBytes); - AddReceive(portStr, token.GroupId, (ulong)memory.Length); + AddReceive(portStr, token.GroupId, memory.Length); IPEndPoint source = result.RemoteEndPoint as IPEndPoint; //已经连接 if (udpConnections.TryGetValue(source, out UdpTargetCache cache) && cache != null) { - AddSendt(portStr, token.GroupId, (ulong)memory.Length); + AddSendt(portStr, token.GroupId, memory.Length); cache.LastTicks.Update(); await token.SourceSocket.SendToAsync(memory, cache.IPEndPoint).ConfigureAwait(false); } @@ -197,8 +197,8 @@ namespace linker.plugins.sforward.proxy cache.LastTicks.Update(); Memory memory = buffer.AsMemory(0, result.ReceivedBytes); - AddReceive(portStr, string.Empty, (ulong)memory.Length); - AddSendt(portStr, string.Empty, (ulong)memory.Length); + AddReceive(portStr, string.Empty, memory.Length); + AddSendt(portStr, string.Empty, memory.Length); //未连接本地服务的,去连接一下 if (serviceUdp == null) { @@ -239,8 +239,8 @@ namespace linker.plugins.sforward.proxy break; } Memory memory = buffer.AsMemory(0, result.ReceivedBytes); - AddReceive(portStr, string.Empty, (ulong)memory.Length); - AddSendt(portStr, string.Empty, (ulong)memory.Length); + AddReceive(portStr, string.Empty, memory.Length); + AddSendt(portStr, string.Empty, memory.Length); await serverUdp.SendToAsync(memory, server).ConfigureAwait(false); cache.LastTicks.Update(); @@ -261,7 +261,7 @@ namespace linker.plugins.sforward.proxy private void UdpTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { var connections = udpConnections.Where(c => c.Value.Timeout).Select(c => c.Key); foreach (var item in connections) diff --git a/src/linker.messenger.signin/SignInClientTransfer.cs b/src/linker.messenger.signin/SignInClientTransfer.cs index b3d39d2e..c347b69c 100644 --- a/src/linker.messenger.signin/SignInClientTransfer.cs +++ b/src/linker.messenger.signin/SignInClientTransfer.cs @@ -34,7 +34,7 @@ namespace linker.messenger.signin /// public void SignInTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { if (clientSignInState.Connected == false) { @@ -49,7 +49,7 @@ namespace linker.messenger.signin } } return true; - }, () => 10000); + }, 10000); } public void ReSignIn() diff --git a/src/linker.messenger.signin/SignInServerCaching.cs b/src/linker.messenger.signin/SignInServerCaching.cs index 7ef01729..ab168d7c 100644 --- a/src/linker.messenger.signin/SignInServerCaching.cs +++ b/src/linker.messenger.signin/SignInServerCaching.cs @@ -121,7 +121,7 @@ namespace linker.messenger.signin private void ClearTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { diff --git a/src/linker.messenger.socks5/TunnelProxyUdp.cs b/src/linker.messenger.socks5/TunnelProxyUdp.cs index accaa73c..2b9c6125 100644 --- a/src/linker.messenger.socks5/TunnelProxyUdp.cs +++ b/src/linker.messenger.socks5/TunnelProxyUdp.cs @@ -73,7 +73,7 @@ namespace linker.messenger.socks5 } CloseClientSocket(token); } - + private async Task SendToConnection(AsyncUserUdpToken token) { if (token.Connection == null) return; @@ -96,7 +96,7 @@ namespace linker.messenger.socks5 token.Proxy.Return(connectData); } } - + private async Task SendToConnections(AsyncUserUdpToken token) { byte[] connectData = token.Proxy.ToBytes(out int length); @@ -242,7 +242,7 @@ namespace linker.messenger.socks5 private void TaskUdp() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { var connections = udpConnections.Where(c => c.Value.Timeout).Select(c => c.Key).ToList(); foreach (var item in connections) @@ -259,7 +259,7 @@ namespace linker.messenger.socks5 } } return true; - }, () => 3 * 60 * 1000); + }, 3 * 60 * 1000); } private void CloseClientSocketUdp(ITunnelConnection connection) diff --git a/src/linker.messenger.store.file/Entry.cs b/src/linker.messenger.store.file/Entry.cs index f3c23797..6d49cb05 100644 --- a/src/linker.messenger.store.file/Entry.cs +++ b/src/linker.messenger.store.file/Entry.cs @@ -32,6 +32,8 @@ using linker.messenger.tuntap.lease; using linker.messenger.updater; using linker.plugins.tunnel; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Yitter.IdGenerator; namespace linker.messenger.store.file { public static class Entry @@ -40,6 +42,8 @@ namespace linker.messenger.store.file { LoggerHelper.Instance.Info("add store file"); + YitIdHelper.SetIdGenerator(new IdGeneratorOptions(1)); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/src/linker.messenger.store.file/FileConfig.cs b/src/linker.messenger.store.file/FileConfig.cs index b3b9b4ed..98a2a77b 100644 --- a/src/linker.messenger.store.file/FileConfig.cs +++ b/src/linker.messenger.store.file/FileConfig.cs @@ -127,7 +127,7 @@ namespace linker.messenger.store.file } private void SaveTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { while (Data.Updated > 0) { diff --git a/src/linker.messenger.store.file/RunningConfig.cs b/src/linker.messenger.store.file/RunningConfig.cs index fe8b9691..0744b9b7 100644 --- a/src/linker.messenger.store.file/RunningConfig.cs +++ b/src/linker.messenger.store.file/RunningConfig.cs @@ -45,7 +45,7 @@ namespace linker.messenger.store.file } private void SaveTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { while (Data.Updated > 0) { diff --git a/src/linker.messenger.store.file/Storefactory.cs b/src/linker.messenger.store.file/Storefactory.cs index ac1a188f..a9286611 100644 --- a/src/linker.messenger.store.file/Storefactory.cs +++ b/src/linker.messenger.store.file/Storefactory.cs @@ -34,7 +34,7 @@ namespace linker.messenger.store.file private void CheckpointTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { database.Checkpoint(); return true; diff --git a/src/linker.messenger.store.file/forward/ForwardClientStore.cs b/src/linker.messenger.store.file/forward/ForwardClientStore.cs index a6c2508f..9d69a21f 100644 --- a/src/linker.messenger.store.file/forward/ForwardClientStore.cs +++ b/src/linker.messenger.store.file/forward/ForwardClientStore.cs @@ -1,4 +1,5 @@ using linker.messenger.forward; +using Yitter.IdGenerator; namespace linker.messenger.store.file.forward { @@ -23,7 +24,7 @@ namespace linker.messenger.store.file.forward return runningConfig.Data.Forwards; } - public ForwardInfo Get(uint id) + public ForwardInfo Get(long id) { return runningConfig.Data.Forwards.FirstOrDefault(x => x.Id == id); } @@ -35,6 +36,11 @@ namespace linker.messenger.store.file.forward public bool Add(ForwardInfo info) { + if(info.Id == 0) + { + info.Id = YitIdHelper.NextId(); + } + runningConfig.Data.Forwards.Add(info); return true; } @@ -42,7 +48,7 @@ namespace linker.messenger.store.file.forward { return true; } - public bool Remove(uint id) + public bool Remove(long id) { runningConfig.Data.Forwards.Remove(Get(id)); return true; diff --git a/src/linker.messenger.store.file/linker.messenger.store.file.csproj b/src/linker.messenger.store.file/linker.messenger.store.file.csproj index 78967d4a..47323d9b 100644 --- a/src/linker.messenger.store.file/linker.messenger.store.file.csproj +++ b/src/linker.messenger.store.file/linker.messenger.store.file.csproj @@ -38,6 +38,7 @@ + diff --git a/src/linker.messenger.store.file/relay/Config.cs b/src/linker.messenger.store.file/relay/Config.cs index 6c5a300f..ed32b6d5 100644 --- a/src/linker.messenger.store.file/relay/Config.cs +++ b/src/linker.messenger.store.file/relay/Config.cs @@ -8,6 +8,7 @@ namespace linker.messenger.store.file public sealed partial class RunningConfigInfo { public RelayInfo Relay { get; set; } = new RelayInfo(); + } public sealed class RelayInfo @@ -43,6 +44,8 @@ namespace linker.messenger.store.file #else public string SecretKey { get; set; } = Guid.NewGuid().ToString().ToUpper(); #endif + public RelayServerCdkeyConfigInfo Cdkey { get; set; } = new RelayServerCdkeyConfigInfo(); + public DistributedInfo Distributed { get; set; } = new DistributedInfo { }; } diff --git a/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs b/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs index ffb0950e..14c5a7b7 100644 --- a/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs +++ b/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs @@ -1,23 +1,29 @@ using linker.messenger.relay.server; using LiteDB; +using Yitter.IdGenerator; namespace linker.messenger.store.file.relay { public sealed class RelayServerCdkeyStore : IRelayServerCdkeyStore { private readonly Storefactory dBfactory; - private readonly ILiteCollection liteCollection; + private readonly ILiteCollection liteCollection; public RelayServerCdkeyStore(Storefactory dBfactory, FileConfig fileConfig) { this.dBfactory = dBfactory; - liteCollection = dBfactory.GetCollection("relayCdkey"); + liteCollection = dBfactory.GetCollection("relayCdkey"); } - public async Task Add(RelayServerCdkeyInfo info) + public async Task Add(RelayServerCdkeyStoreInfo info) { if (string.IsNullOrWhiteSpace(info.Id)) { info.Id = ObjectId.NewObjectId().ToString(); + info.CdKey = Guid.NewGuid().ToString().ToUpper(); + info.AddTime = DateTime.Now; + info.UseTime = DateTime.Now; + info.LastBytes = info.MaxBytes; + info.CdkeyId = YitIdHelper.NextId(); liteCollection.Insert(info); } else @@ -26,40 +32,64 @@ namespace linker.messenger.store.file.relay } return await Task.FromResult(true); } - public async Task Del(string id) + public async Task Del(long id) { - return await Task.FromResult(liteCollection.Delete(id)); + return await Task.FromResult(liteCollection.DeleteMany(c => c.CdkeyId == id) > 0); } - public async Task> Get(string userid) + public async Task Traffic(Dictionary dic) + { + foreach (var item in dic) + { + var info = liteCollection.FindOne(x => x.CdkeyId == item.Key); + if (info != null) + { + long bytes = info.LastBytes >= item.Value ? info.LastBytes - item.Value : 0; + liteCollection.UpdateMany(x => new RelayServerCdkeyStoreInfo { LastBytes = bytes, UseTime = DateTime.Now }, c => c.CdkeyId == item.Key); + } + } + return await Task.FromResult(true); + } + + public async Task> GetAvailable(string userid) { return await Task.FromResult(liteCollection.Find(x => x.UserId == userid && x.LastBytes > 0 && x.StartTime <= DateTime.Now && x.EndTime < DateTime.Now).ToList()); } - - public async Task Get(RelayServerCdkeyPageRequestInfo relayServerCdkeyPageRequestInfo) + public async Task> Get(List ids) { - ILiteQueryable query = liteCollection.Query(); + return await Task.FromResult(liteCollection.Find(x => ids.Contains(x.CdkeyId)).ToList()); + } - if (string.IsNullOrWhiteSpace(relayServerCdkeyPageRequestInfo.Order) == false) + public async Task Get(RelayServerCdkeyPageRequestInfo info) + { + ILiteQueryable query = liteCollection.Query(); + + if (string.IsNullOrWhiteSpace(info.Order) == false) { - query = query.OrderBy(relayServerCdkeyPageRequestInfo.Order, relayServerCdkeyPageRequestInfo.Sort == "asc" ? Query.Ascending : Query.Descending); + query = query.OrderBy(info.Order, info.Sort == "asc" ? Query.Ascending : Query.Descending); } - if (string.IsNullOrWhiteSpace(relayServerCdkeyPageRequestInfo.UserId) == false) + else { - query = query.Where(x => x.UserId == relayServerCdkeyPageRequestInfo.UserId); + query = query.OrderBy(c => c.CdkeyId, Query.Descending); } - if (string.IsNullOrWhiteSpace(relayServerCdkeyPageRequestInfo.Remark) == false) + if (string.IsNullOrWhiteSpace(info.UserId) == false) { - query = query.Where(x => x.Remark.Contains(relayServerCdkeyPageRequestInfo.Remark)); + query = query.Where(x => x.UserId == info.UserId); + } + if (string.IsNullOrWhiteSpace(info.Remark) == false) + { + query = query.Where(x => x.Remark.Contains(info.Remark)); } return await Task.FromResult(new RelayServerCdkeyPageResultInfo { - Page = relayServerCdkeyPageRequestInfo.Page, - Size = relayServerCdkeyPageRequestInfo.Size, + Page = info.Page, + Size = info.Size, Count = query.Count(), - List = query.Skip((relayServerCdkeyPageRequestInfo.Page - 1) * relayServerCdkeyPageRequestInfo.Size).Limit(relayServerCdkeyPageRequestInfo.Size).ToList() + List = query.Skip((info.Page - 1) * info.Size).Limit(info.Size).ToList() }); } + + } } diff --git a/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs b/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs index 74b272fd..3bbd764b 100644 --- a/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs +++ b/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs @@ -22,7 +22,7 @@ namespace linker.messenger.store.file.relay { config.Data.Server.Relay.Distributed.Node = node; } - public void SetMaxGbTotalLastBytes(ulong value) + public void SetMaxGbTotalLastBytes(long value) { config.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes=value; } diff --git a/src/linker.messenger.store.file/sforward/SForwardClientStore.cs b/src/linker.messenger.store.file/sforward/SForwardClientStore.cs index 3a70659a..d6bd9c09 100644 --- a/src/linker.messenger.store.file/sforward/SForwardClientStore.cs +++ b/src/linker.messenger.store.file/sforward/SForwardClientStore.cs @@ -1,5 +1,6 @@ using linker.messenger.sforward; using linker.messenger.sforward.client; +using Yitter.IdGenerator; namespace linker.messenger.store.file.sforward { @@ -36,7 +37,7 @@ namespace linker.messenger.store.file.sforward return runningConfig.Data.SForwards; } - public SForwardInfo Get(uint id) + public SForwardInfo Get(long id) { return runningConfig.Data.SForwards.FirstOrDefault(x => x.Id == id); } @@ -53,6 +54,10 @@ namespace linker.messenger.store.file.sforward public bool Add(SForwardInfo info) { + if (info.Id == 0) + { + info.Id = YitIdHelper.NextId(); + } runningConfig.Data.SForwards.Add(info); return true; } @@ -60,7 +65,7 @@ namespace linker.messenger.store.file.sforward { return true; } - public bool Remove(uint id) + public bool Remove(long id) { runningConfig.Data.SForwards.Remove(Get(id)); return true; diff --git a/src/linker.messenger.tunnel/TunnelServerExternalResolver.cs b/src/linker.messenger.tunnel/TunnelServerExternalResolver.cs index a130b8b3..6b29c178 100644 --- a/src/linker.messenger.tunnel/TunnelServerExternalResolver.cs +++ b/src/linker.messenger.tunnel/TunnelServerExternalResolver.cs @@ -14,8 +14,8 @@ namespace linker.messenger.tunnel { public byte Type => (byte)ResolverType.External; - public virtual void AddReceive( ulong bytes) { } - public virtual void AddSendt(ulong bytes) { } + public virtual void AddReceive( long bytes) { } + public virtual void AddSendt(long bytes) { } /// /// UDP @@ -28,12 +28,12 @@ namespace linker.messenger.tunnel { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{ep} get udp external port"); - AddReceive((ulong)memory.Length); + AddReceive(memory.Length); byte[] sendData = ArrayPool.Shared.Rent(1024); try { var send = BuildSendData(sendData, ep); - AddSendt((ulong)send.Length); + AddSendt(send.Length); await socket.SendToAsync(send, SocketFlags.None, ep).ConfigureAwait(false); } catch (Exception ex) @@ -57,7 +57,7 @@ namespace linker.messenger.tunnel try { memory = BuildSendData(sendData, socket.RemoteEndPoint as IPEndPoint); - AddSendt((ulong)memory.Length); + AddSendt(memory.Length); await socket.SendAsync(memory, SocketFlags.None).ConfigureAwait(false); } catch (Exception ex) diff --git a/src/linker.messenger.tuntap/TuntapAdapter.cs b/src/linker.messenger.tuntap/TuntapAdapter.cs index 8b7e9ceb..921a39ef 100644 --- a/src/linker.messenger.tuntap/TuntapAdapter.cs +++ b/src/linker.messenger.tuntap/TuntapAdapter.cs @@ -80,11 +80,11 @@ namespace linker.messenger.tuntap private OperatingManager checking = new OperatingManager(); private void CheckDeviceTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { await CheckDevice(); return true; - }, () => 30000); + }, 30000); } private async Task CheckDevice() { diff --git a/src/linker.messenger.tuntap/TuntapPingTransfer.cs b/src/linker.messenger.tuntap/TuntapPingTransfer.cs index e57786c5..d7673c63 100644 --- a/src/linker.messenger.tuntap/TuntapPingTransfer.cs +++ b/src/linker.messenger.tuntap/TuntapPingTransfer.cs @@ -35,7 +35,7 @@ namespace linker.messenger.tuntap } private void PingTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { if (tuntapTransfer.Status == TuntapStatus.Running) { diff --git a/src/linker.messenger.tuntap/lease/LeaseClientTreansfer.cs b/src/linker.messenger.tuntap/lease/LeaseClientTreansfer.cs index 21fa2e6b..92e883ed 100644 --- a/src/linker.messenger.tuntap/lease/LeaseClientTreansfer.cs +++ b/src/linker.messenger.tuntap/lease/LeaseClientTreansfer.cs @@ -73,7 +73,7 @@ namespace linker.messenger.tuntap.lease private void LeaseExpTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { await messengerSender.SendReply(new MessageRequestWrap { @@ -82,7 +82,7 @@ namespace linker.messenger.tuntap.lease }); return true; - }, () => 60000); + }, 60000); } } } diff --git a/src/linker.messenger.tuntap/lease/LeaseServerTreansfer.cs b/src/linker.messenger.tuntap/lease/LeaseServerTreansfer.cs index bf1fbb9b..b1b82e3d 100644 --- a/src/linker.messenger.tuntap/lease/LeaseServerTreansfer.cs +++ b/src/linker.messenger.tuntap/lease/LeaseServerTreansfer.cs @@ -219,7 +219,7 @@ namespace linker.messenger.tuntap.lease private void ClearTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { diff --git a/src/linker.messenger.updater/UpdaterClientTransfer.cs b/src/linker.messenger.updater/UpdaterClientTransfer.cs index e0323a9f..307b2571 100644 --- a/src/linker.messenger.updater/UpdaterClientTransfer.cs +++ b/src/linker.messenger.updater/UpdaterClientTransfer.cs @@ -89,7 +89,7 @@ namespace linker.messenger.updater } private void UpdateTask() { - TimerHelper.SetInterval(async () => + TimerHelper.SetIntervalLong(async () => { await GetUpdateInfo(); if (updateInfo.Updated) diff --git a/src/linker.messenger/MessengerResolver.cs b/src/linker.messenger/MessengerResolver.cs index a4a82e24..7cc7176c 100644 --- a/src/linker.messenger/MessengerResolver.cs +++ b/src/linker.messenger/MessengerResolver.cs @@ -15,7 +15,7 @@ namespace linker.messenger public interface IMessengerResolver { public Task BeginReceiveClient(Socket socket); - public Task BeginReceiveClient(Socket socket, bool sendFlag, byte flag, byte[] data); + public Task BeginReceiveClient(Socket socket, bool sendFlag, byte flag, Memory data); public void AddMessenger(List list); public Task BeginReceiveServer(Socket socket, Memory memory); public Task BeginReceiveServer(Socket socket, IPEndPoint ep, Memory memory); @@ -59,8 +59,8 @@ namespace linker.messenger } - public virtual void AddReceive(ushort id, ulong bytes) { } - public virtual void AddSendt(ushort id, ulong bytes) { } + public virtual void AddReceive(ushort id, long bytes) { } + public virtual void AddSendt(ushort id, long bytes) { } /// /// 以服务器模式接收数据 TCP @@ -113,7 +113,7 @@ namespace linker.messenger /// /// /// - public async Task BeginReceiveClient(Socket socket, bool sendFlag, byte flag, byte[] data) + public async Task BeginReceiveClient(Socket socket, bool sendFlag, byte flag, Memory data) { try { @@ -230,7 +230,7 @@ namespace linker.messenger //新的请求 requestWrap.FromArray(data); - AddReceive(requestWrap.MessengerId, (ulong)data.Length); + AddReceive(requestWrap.MessengerId, data.Length); //404,没这个插件 if (messengers.TryGetValue(requestWrap.MessengerId, out MessengerCacheInfo plugin) == false) { diff --git a/src/linker.messenger/MessengerSender.cs b/src/linker.messenger/MessengerSender.cs index 1799cf1c..124f1836 100644 --- a/src/linker.messenger/MessengerSender.cs +++ b/src/linker.messenger/MessengerSender.cs @@ -47,8 +47,8 @@ namespace linker.messenger { } - public virtual void AddReceive(ushort id, ulong bytes) { } - public virtual void AddSendt(ushort id, ulong bytes) { } + public virtual void AddReceive(ushort id, long bytes) { } + public virtual void AddSendt(ushort id, long bytes) { } public async Task SendReply(MessageRequestWrap msg) { if (msg.Connection == null || msg.Connection.Connected == false) @@ -105,7 +105,7 @@ namespace linker.messenger byte[] bytes = msg.ToArray(out int length); - AddSendt(msg.MessengerId, (ulong)bytes.Length); + AddSendt(msg.MessengerId, bytes.Length); bool res = await msg.Connection.SendAsync(bytes.AsMemory(0, length)).ConfigureAwait(false); msg.Return(bytes); @@ -130,7 +130,7 @@ namespace linker.messenger byte[] bytes = msg.ToArray(out int length); - AddSendt(messengerId, (ulong)length); + AddSendt(messengerId, length); bool res = await msg.Connection.SendAsync(bytes.AsMemory(0, length)).ConfigureAwait(false); msg.Return(bytes); @@ -151,7 +151,7 @@ namespace linker.messenger byte[] bytes = new byte[wrap.Payload.Length]; wrap.Payload.CopyTo(bytes); - AddReceive(info.MessengerId, (ulong)bytes.Length); + AddReceive(info.MessengerId, bytes.Length); info.Tcs.SetResult(new MessageResponeInfo { Code = wrap.Code, Data = bytes, Connection = wrap.Connection }); } } diff --git a/src/linker.tray.win/default.aproj b/src/linker.tray.win/default.aproj index 3836ce3f..e8f6e61f 100644 --- a/src/linker.tray.win/default.aproj +++ b/src/linker.tray.win/default.aproj @@ -1,5 +1,5 @@ - + diff --git a/src/linker.tray.win/dist/linker.tray.win.exe b/src/linker.tray.win/dist/linker.tray.win.exe index 341a340e..5903cbc1 100644 Binary files a/src/linker.tray.win/dist/linker.tray.win.exe and b/src/linker.tray.win/dist/linker.tray.win.exe differ diff --git a/src/linker.tunnel/TunnelUpnpTransfer.cs b/src/linker.tunnel/TunnelUpnpTransfer.cs index 06f63f6c..e4f552bf 100644 --- a/src/linker.tunnel/TunnelUpnpTransfer.cs +++ b/src/linker.tunnel/TunnelUpnpTransfer.cs @@ -34,7 +34,7 @@ namespace linker.tunnel private void LoopDiscovery() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { NatUtility.StopDiscovery(); NatUtility.StartDiscovery(); diff --git a/src/linker.tunnel/transport/TransportTcpNutssb.cs b/src/linker.tunnel/transport/TransportTcpNutssb.cs index 0024a1e9..3e60ad37 100644 --- a/src/linker.tunnel/transport/TransportTcpNutssb.cs +++ b/src/linker.tunnel/transport/TransportTcpNutssb.cs @@ -164,7 +164,8 @@ namespace linker.tunnel.transport { targetSocket.KeepAlive(); - targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); + targetSocket.IPv6Only(ep.AddressFamily, false); + targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { @@ -218,7 +219,8 @@ namespace linker.tunnel.transport try { targetSocket.Ttl = ip.Address.AddressFamily == AddressFamily.InterNetworkV6 ? (short)2 : (short)(tunnelTransportInfo.Local.RouteLevel); - targetSocket.ReuseBind(new IPEndPoint(ip.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); + targetSocket.IPv6Only(IPAddress.IPv6Any.AddressFamily, false); + targetSocket.ReuseBind(new IPEndPoint(IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); _ = targetSocket.ConnectAsync(ip); return targetSocket; } @@ -315,15 +317,10 @@ namespace linker.tunnel.transport private async Task StartListen(IPEndPoint local, TunnelTransportInfo tunnelTransportInfo) { - IPAddress localIP = tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6) - && tunnelTransportInfo.Remote.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6) - ? IPAddress.IPv6Any : IPAddress.Any; - + IPAddress localIP = IPAddress.IPv6Any; Socket socket = new Socket(localIP.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); - //socket.ReceiveBufferSize = 5 * 1024 * 1024; - - //socket.IPv6Only(localIP.AddressFamily, false); - socket.Bind(new IPEndPoint(localIP, local.Port)); + socket.IPv6Only(localIP.AddressFamily, false); + socket.ReuseBind(new IPEndPoint(localIP, local.Port)); socket.Listen(int.MaxValue); try diff --git a/src/linker.tunnel/transport/TransportTcpP2PNAT.cs b/src/linker.tunnel/transport/TransportTcpP2PNAT.cs index 0dcd6f19..38dc154c 100644 --- a/src/linker.tunnel/transport/TransportTcpP2PNAT.cs +++ b/src/linker.tunnel/transport/TransportTcpP2PNAT.cs @@ -119,15 +119,16 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } - IPEndPoint ep = tunnelTransportInfo.Remote.LocalIps.Any(c=>c.AddressFamily == AddressFamily.InterNetworkV6) + IPEndPoint ep = tunnelTransportInfo.Remote.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6) && tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6) - ? new IPEndPoint(tunnelTransportInfo.Remote.LocalIps.FirstOrDefault(c=>c.AddressFamily == AddressFamily.InterNetworkV6), tunnelTransportInfo.Remote.Remote.Port) - : tunnelTransportInfo.Remote.Remote; + ? new IPEndPoint(tunnelTransportInfo.Remote.LocalIps.FirstOrDefault(c => c.AddressFamily == AddressFamily.InterNetworkV6), tunnelTransportInfo.Remote.Remote.Port) + : tunnelTransportInfo.Remote.Remote; Socket targetSocket = new(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); try { targetSocket.KeepAlive(); - targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? tunnelTransportInfo.Local.Local.Address : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); + targetSocket.IPv6Only(ep.AddressFamily, false); + targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { diff --git a/src/linker.tunnel/transport/TransportTcpPortMap.cs b/src/linker.tunnel/transport/TransportTcpPortMap.cs index 02ec9e45..9fe51e84 100644 --- a/src/linker.tunnel/transport/TransportTcpPortMap.cs +++ b/src/linker.tunnel/transport/TransportTcpPortMap.cs @@ -314,7 +314,8 @@ namespace linker.tunnel.transport try { targetSocket.KeepAlive(); - targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? tunnelTransportInfo.Local.Local.Address : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); + targetSocket.IPv6Only(ep.AddressFamily, false); + targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { diff --git a/src/linker.tunnel/transport/TransportUdp.cs b/src/linker.tunnel/transport/TransportUdp.cs index 3885ae0d..135dec01 100644 --- a/src/linker.tunnel/transport/TransportUdp.cs +++ b/src/linker.tunnel/transport/TransportUdp.cs @@ -147,10 +147,9 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } - IPEndPoint local = new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port); TaskCompletionSource taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); //监听连接 - Socket remoteUdp = BindListen(local, taskCompletionSource); + Socket remoteUdp = BindListen(tunnelTransportInfo.Local.Local, taskCompletionSource); //给对方发送简单消息 foreach (IPEndPoint ep in tunnelTransportInfo.RemoteEndPoints) @@ -216,7 +215,9 @@ namespace linker.tunnel.transport /// private Socket BindListen(IPEndPoint local, TaskCompletionSource tcs) { + local = new IPEndPoint(IPAddress.IPv6Any, local.Port); Socket socket = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); + socket.IPv6Only(local.AddressFamily, false); socket.WindowsUdpBug(); socket.ReuseBind(local); @@ -238,9 +239,11 @@ namespace linker.tunnel.transport /// private async Task BindListen(IPEndPoint local, TunnelTransportInfo state) { + local = new IPEndPoint(IPAddress.IPv6Any,local.Port); Socket socket = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); try { + socket.IPv6Only(local.AddressFamily,false); socket.ReuseBind(local); socket.WindowsUdpBug(); ListenAsyncToken token = new ListenAsyncToken @@ -267,7 +270,7 @@ namespace linker.tunnel.transport try { byte[] buffer = new byte[8 * 1024]; - IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0); + IPEndPoint ep = new IPEndPoint(IPAddress.IPv6Any, 0); while (true) { SocketReceiveFromResult result = await token.LocalUdp.ReceiveFromAsync(buffer, ep).ConfigureAwait(false); @@ -306,7 +309,7 @@ namespace linker.tunnel.transport /// private void BindAndTTL(TunnelTransportInfo tunnelTransportInfo) { - IPEndPoint local = new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port); + IPEndPoint local = new IPEndPoint(IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port); foreach (var ip in tunnelTransportInfo.RemoteEndPoints) { try @@ -316,15 +319,13 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Warning($"{Name} ttl to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ip}"); } - if (ip.AddressFamily == AddressFamily.InterNetwork) - { - Socket socket = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); - socket.WindowsUdpBug(); - socket.ReuseBind(local); - socket.Ttl = (short)(tunnelTransportInfo.Local.RouteLevel); - _ = socket.SendToAsync(new byte[0], SocketFlags.None, ip); - socket.SafeClose(); - } + Socket socket = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); + socket.IPv6Only(local.AddressFamily, false); + socket.WindowsUdpBug(); + socket.ReuseBind(local); + socket.Ttl = (short)(tunnelTransportInfo.Local.RouteLevel); + _ = socket.SendToAsync(new byte[0], SocketFlags.None, ip); + socket.SafeClose(); } catch (Exception ex) { diff --git a/src/linker.tunnel/transport/TransportUdpPortMap.cs b/src/linker.tunnel/transport/TransportUdpPortMap.cs index b6781b6f..46b119a9 100644 --- a/src/linker.tunnel/transport/TransportUdpPortMap.cs +++ b/src/linker.tunnel/transport/TransportUdpPortMap.cs @@ -314,7 +314,8 @@ namespace linker.tunnel.transport try { targetSocket.WindowsUdpBug(); - targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? tunnelTransportInfo.Local.Local.Address : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); + targetSocket.IPv6Only(ep.AddressFamily, false); + targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { @@ -322,7 +323,7 @@ namespace linker.tunnel.transport } await targetSocket.SendToAsync($"{flagTexts}-{tunnelTransportInfo.Local.MachineId}-{tunnelTransportInfo.FlowId}".ToBytes(), ep).ConfigureAwait(false); - await targetSocket.ReceiveFromAsync(new byte[1024], new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any: IPAddress.IPv6Any, 0)).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); + await targetSocket.ReceiveFromAsync(new byte[1024], new IPEndPoint(IPAddress.IPv6Any, 0)).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep} success"); @@ -365,7 +366,7 @@ namespace linker.tunnel.transport private void CleanTask() { - TimerHelper.SetInterval(() => + TimerHelper.SetIntervalLong(() => { var keys = connectionsDic.Where(c => (c.Value.Connection == null && c.Value.LastTicks.DiffGreater(5000)) || (c.Value.Connection != null && c.Value.Connection.Connected == false)).Select(c => c.Key).ToList(); foreach (var item in keys) diff --git a/src/linker.web/package-lock.json b/src/linker.web/package-lock.json index ea06eb86..a448f56a 100644 --- a/src/linker.web/package-lock.json +++ b/src/linker.web/package-lock.json @@ -11,6 +11,7 @@ "@element-plus/icons-vue": "^2.3.1", "core-js": "^3.38.0", "element-plus": "^2.8.0", + "moment": "^2.30.1", "vue": "^3.4.38", "vue-i18n": "^11.0.1", "vue-router": "^4.4.3" @@ -6792,6 +6793,14 @@ "dev": true, "license": "MIT" }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, "node_modules/mrmime": { "version": "2.0.0", "dev": true, diff --git a/src/linker.web/package.json b/src/linker.web/package.json index e57213aa..045d37cc 100644 --- a/src/linker.web/package.json +++ b/src/linker.web/package.json @@ -10,6 +10,7 @@ "@element-plus/icons-vue": "^2.3.1", "core-js": "^3.38.0", "element-plus": "^2.8.0", + "moment": "^2.30.1", "vue": "^3.4.38", "vue-i18n": "^11.0.1", "vue-router": "^4.4.3" diff --git a/src/linker.web/public/aliyun.svg b/src/linker.web/public/aliyun.svg new file mode 100644 index 00000000..4218d58c --- /dev/null +++ b/src/linker.web/public/aliyun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/linker.web/public/amazon.svg b/src/linker.web/public/amazon.svg new file mode 100644 index 00000000..c5efca13 --- /dev/null +++ b/src/linker.web/public/amazon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/linker.web/public/huawei.svg b/src/linker.web/public/huawei.svg new file mode 100644 index 00000000..72f088c6 --- /dev/null +++ b/src/linker.web/public/huawei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/linker.web/src/apis/relay.js b/src/linker.web/src/apis/relay.js index 23a59da8..242a1e14 100644 --- a/src/linker.web/src/apis/relay.js +++ b/src/linker.web/src/apis/relay.js @@ -11,4 +11,13 @@ export const relayConnect = (data) => { } export const relayCdkeyAccess = () => { return sendWebsocketMsg('relay/AccessCdkey'); +} +export const relayCdkeyPage = (data) => { + return sendWebsocketMsg('relay/PageCdkey', data); +} +export const relayCdkeyAdd = (data) => { + return sendWebsocketMsg('relay/AddCdkey', data); +} +export const relayCdkeyDel = (data) => { + return sendWebsocketMsg('relay/DelCdkey', data); } \ No newline at end of file diff --git a/src/linker.web/src/lang/en-us.js b/src/linker.web/src/lang/en-us.js index b5cb066a..5b399b52 100644 --- a/src/linker.web/src/lang/en-us.js +++ b/src/linker.web/src/lang/en-us.js @@ -11,7 +11,6 @@ export default { 'head.home': 'Home', 'head.server': 'Server', - 'head.group': 'Group', 'head.protocol': 'P2P Protocol', 'head.action': 'Action', 'head.logger': 'Logs', @@ -38,13 +37,19 @@ export default { 'server.messengerSecretKey': 'Messenger SecretKey', 'server.messengerSecretKeyText': 'Messenger SecretKey', 'server.messengerUserId': 'User Id', - 'server.messengerUserIdText': 'Your unique identifier,for card key (CDKEY).', + 'server.messengerUserIdText': 'Your unique identifier,used to unlock something.', 'permission.closed': 'Closed', 'permission.simple': 'Simple', 'permission.full': 'Full', 'permission.clear': 'Clear connection', + 'status.group': 'Group manager', + 'status.groupName': 'Name', + 'status.groupPassword': 'Password', + 'status.groupOper': 'Oper', + 'status.groupDelConfirm': 'Are you sure to delete?', + 'status.support': 'Support', 'status.export': 'Export', 'status.exportText': 'Export the configuration to run elsewhere', @@ -126,6 +131,24 @@ export default { 'server.relayMyCdkey': 'My CDKEY', 'server.relayCdkey': 'Manager CDKEY', + 'server.relayCdkeyUserId': 'UserId', + 'server.relayCdkeyBandwidth': 'Bandwidth', + 'server.relayCdkeyMaxBytes': 'Total', + 'server.relayCdkeyLastBytes': 'Surplus', + 'server.relayCdkeyMemory': 'Price', + 'server.relayCdkeyPayMemory': 'Pay', + 'server.relayCdkeyAddTime': 'Add', + 'server.relayCdkeyStartTime': 'Start', + 'server.relayCdkeyDuration': 'Duration', + 'server.relayCdkeyStartTimeY': 'Year', + 'server.relayCdkeyStartTimeM': 'Month', + 'server.relayCdkeyEndTime': 'End', + 'server.relayCdkeyUseTime': 'Use', + 'server.relayCdkeyRemark': 'Remark', + 'server.relayCdkeyOper': 'Oper', + 'server.relayCdkeyDelConfirm': 'Are you sure to delete?', + + 'server.sforwardSecretKey': 'Server forward secretKey', 'server.sforwardText': 'The server forward can be used when the key is correct', @@ -139,11 +162,6 @@ export default { 'server.updaterMM': 'Minute', 'server.updaterS': 'Second', - 'server.groupName': 'Name', - 'server.groupPassword': 'Password', - 'server.groupOper': 'Oper', - 'server.groupDelConfirm': 'Are you sure to delete?', - 'server.asyncText': 'Synchronize to all clients', 'server.asyncSelect': 'Please select', 'server.asyncCheckAll': 'Check all', diff --git a/src/linker.web/src/lang/zh-cn.js b/src/linker.web/src/lang/zh-cn.js index 388a9ab9..2b482ce7 100644 --- a/src/linker.web/src/lang/zh-cn.js +++ b/src/linker.web/src/lang/zh-cn.js @@ -37,13 +37,19 @@ export default { 'server.messengerSecretKey': '信标密钥', 'server.messengerSecretKeyText': '密钥正确时可连接服务器', 'server.messengerUserId': '用户id', - 'server.messengerUserIdText': '你的唯一标识,用于流量卡密CDKEY', + 'server.messengerUserIdText': '你的唯一标识,用于解锁一些限制', 'permission.closed': '禁止通行', 'permission.simple': '简单管理', 'permission.full': '专业管理', 'permission.clear': '清除连接', + 'status.group': '管理分组', + 'status.groupName': '名称', + 'status.groupPassword': '密码', + 'status.groupOper': '操作', + 'status.groupDelConfirm': '确认删除吗?', + 'status.support': '赞助', 'status.export': '导出配置', @@ -128,6 +134,23 @@ export default { 'server.relayMyCdkey': '我的CDKEY', 'server.relayCdkey': '管理CDKEY', + 'server.relayCdkeyUserId': '用户标识', + 'server.relayCdkeyBandwidth': '最大带宽', + 'server.relayCdkeyMaxBytes': '总流量', + 'server.relayCdkeyLastBytes': '剩余流量', + 'server.relayCdkeyMemory': '原价', + 'server.relayCdkeyPayMemory': '支付', + 'server.relayCdkeyAddTime': '添加', + 'server.relayCdkeyStartTime': '开始', + 'server.relayCdkeyDuration': '持续时间', + 'server.relayCdkeyStartTimeY': '年', + 'server.relayCdkeyStartTimeM': '月', + 'server.relayCdkeyEndTime': '结束', + 'server.relayCdkeyUseTime': '使用', + 'server.relayCdkeyRemark': '备注', + 'server.relayCdkeyOper': '操作', + 'server.relayCdkeyDelConfirm': '确认删除吗?', + 'server.sforwardSecretKey': '服务器穿透密钥', 'server.sforwardText': '当密钥正确是可用', @@ -141,10 +164,7 @@ export default { 'server.updaterMM': '分', 'server.updaterS': '秒', - 'server.groupName': '名称', - 'server.groupPassword': '密码', - 'server.groupOper': '操作', - 'server.groupDelConfirm': '确认删除吗?', + 'server.asyncText': '同步到所有客户端', 'server.asyncSelect': '请选择', diff --git a/src/linker.web/src/router/index.js b/src/linker.web/src/router/index.js index 282bcc18..878b7795 100644 --- a/src/linker.web/src/router/index.js +++ b/src/linker.web/src/router/index.js @@ -16,11 +16,6 @@ const routes = [ name: 'FullServers', component: () => import('@/views/full/server/Index.vue') }, - { - path: '/full/group.html', - name: 'FullGroup', - component: () => import('@/views/full/group/Index.vue') - }, { path: '/full/transport.html', name: 'FullTransport', diff --git a/src/linker.web/src/views/full/Head.vue b/src/linker.web/src/views/full/Head.vue index 879bd0f7..934e7db2 100644 --- a/src/linker.web/src/views/full/Head.vue +++ b/src/linker.web/src/views/full/Head.vue @@ -14,9 +14,6 @@ {{$t('head.server')}} - - {{$t('head.group')}} - {{$t('head.protocol')}} diff --git a/src/linker.web/src/views/full/devices/Tunnel.vue b/src/linker.web/src/views/full/devices/Tunnel.vue index 33434e17..9c2622d2 100644 --- a/src/linker.web/src/views/full/devices/Tunnel.vue +++ b/src/linker.web/src/views/full/devices/Tunnel.vue @@ -9,11 +9,17 @@ class="system" :src="`https://unpkg.com/flag-icons@7.2.3/flags/4x3/${tunnel.list[scope.row.MachineId].Net.CountryCode.toLowerCase()}.svg`" /> + + + + + + { + const isp = item.Isp.toLowerCase(); + const org = item.Org.toLowerCase(); const as = item.As.toLowerCase(); for(let j in imgMap){ - if(as.indexOf(j) > -1){ + if(isp.indexOf(j) > -1 || org.indexOf(j) > -1 || as.indexOf(j) > -1){ return `./${imgMap[j]}`; } } @@ -121,7 +132,7 @@ export default { img.system{ height:1.4rem; - vertical-align:middle; margin-right:.4rem + border: 1px solid #eee; } \ No newline at end of file diff --git a/src/linker.web/src/views/full/server/RelayServers.vue b/src/linker.web/src/views/full/server/RelayServers.vue index c4f823f0..0f2b67a6 100644 --- a/src/linker.web/src/views/full/server/RelayServers.vue +++ b/src/linker.web/src/views/full/server/RelayServers.vue @@ -10,7 +10,7 @@ {{$t('server.relayNodes')}} : {{state.nodes.length}} - + @@ -68,9 +68,9 @@ import { ElMessage } from 'element-plus'; import { onMounted, onUnmounted, reactive, watch } from 'vue' import { useI18n } from 'vue-i18n'; import Sync from '../sync/Index.vue' -import Relay from './relay/Index.vue' +import RelayCdkey from './relayCdkey/Index.vue' export default { - components:{Sync,Relay}, + components:{Sync,RelayCdkey}, setup(props) { const {t} = useI18n(); const globalData = injectGlobalData(); diff --git a/src/linker.web/src/views/full/server/relay/Index.vue b/src/linker.web/src/views/full/server/relayCdkey/Index.vue similarity index 61% rename from src/linker.web/src/views/full/server/relay/Index.vue rename to src/linker.web/src/views/full/server/relayCdkey/Index.vue index da26cfb5..d4e62f42 100644 --- a/src/linker.web/src/views/full/server/relay/Index.vue +++ b/src/linker.web/src/views/full/server/relayCdkey/Index.vue @@ -1,25 +1,29 @@ {{$t('server.relayMyCdkey')}} - {{$t('server.relayCdkey')}} + {{$t('server.relayCdkey')}} + + \ No newline at end of file diff --git a/src/linker.web/src/views/full/group/Index.vue b/src/linker.web/src/views/full/status/server/Groups.vue similarity index 82% rename from src/linker.web/src/views/full/group/Index.vue rename to src/linker.web/src/views/full/status/server/Groups.vue index 87f7f6fb..65a14f84 100644 --- a/src/linker.web/src/views/full/group/Index.vue +++ b/src/linker.web/src/views/full/status/server/Groups.vue @@ -1,7 +1,8 @@ - - - + + + + - + @@ -31,15 +32,15 @@ {{ scope.row.Password.replace(/.{1}/g,'*') }} - + - {{ $t('server.groupOper') }} + {{ $t('status.groupOper') }} - + @@ -49,15 +50,17 @@ - + + + \ No newline at end of file diff --git a/src/linker.web/src/views/full/status/server/ServerConfig.vue b/src/linker.web/src/views/full/status/server/ServerConfig.vue index 433d77f3..11e91f86 100644 --- a/src/linker.web/src/views/full/status/server/ServerConfig.vue +++ b/src/linker.web/src/views/full/status/server/ServerConfig.vue @@ -1,78 +1,59 @@ - - {{$t('status.messenger')}} - - - - - - - - - - - - - - - - + + + + {{state.groupName}} + + + + + {{item.Name}} + {{$t('status.group')}} + - + + \ No newline at end of file diff --git a/src/linker/linker.csproj b/src/linker/linker.csproj index 25716bec..eee3cc36 100644 --- a/src/linker/linker.csproj +++ b/src/linker/linker.csproj @@ -23,11 +23,12 @@ 1. 优化linux下路由跟踪问题 2. 优化linux下获取本机IP问题 3. 增加ICS,让win7+、win server2008+支持NAT -4. 增加中继卡密 +4. 增加中继cdkey,使用cdkey解锁公开中继节点的带宽、流量、连接数限制 5. 增加内外穿透定时开关功能 6. 优化管理页面连接接口的体验 -7. 优化一些UI体验,去除同步页面,将同步功能放置各个实际的位置 -8. 其它一些修复优化 +7. 优化一些UI体验,去除同步页面,将同步功能放至各个实际的位置 +8. 优化端口转发,让不同分组间可以使用相同端口 +9. 其它一些修复优化 snltty https://github.com/snltty/linker https://github.com/snltty/linker diff --git a/version.txt b/version.txt index 502e96dc..821f3686 100644 --- a/version.txt +++ b/version.txt @@ -1,10 +1,11 @@ v1.6.9 -2025-03-03 17:44:29 +2025-03-06 21:15:19 1. 优化linux下路由跟踪问题 2. 优化linux下获取本机IP问题 3. 增加ICS,让win7+、win server2008+支持NAT -4. 增加中继卡密 +4. 增加中继cdkey,使用cdkey解锁公开中继节点的带宽、流量、连接数限制 5. 增加内外穿透定时开关功能 6. 优化管理页面连接接口的体验 -7. 优化一些UI体验,去除同步页面,将同步功能放置各个实际的位置 -8. 其它一些修复优化 \ No newline at end of file +7. 优化一些UI体验,去除同步页面,将同步功能放至各个实际的位置 +8. 优化端口转发,让不同分组间可以使用相同端口 +9. 其它一些修复优化 \ No newline at end of file