@@ -36,6 +28,7 @@
import { subWebsocketState } from '@/apis/request.js'
import { injectGlobalData } from '@/provide.js'
import { reactive, onMounted, onUnmounted, computed } from 'vue'
+import Oper from './Oper.vue'
import Device from './Device.vue'
import DeviceEdit from './DeviceEdit.vue'
import Tuntap from './Tuntap.vue'
@@ -57,7 +50,7 @@ import { provideSforward } from './sforward'
import { provideDevices } from './devices'
import { provideUpdater } from './updater'
export default {
- components: {Device,DeviceEdit,Tunnel,TunnelEdit,ConnectionsEdit, Tuntap,TuntapEdit, Forward,ForwardEdit,ForwardCopy,SForwardEdit,SForwardCopy },
+ components: {Oper,Device,DeviceEdit,Tunnel,TunnelEdit,ConnectionsEdit, Tuntap,TuntapEdit, Forward,ForwardEdit,ForwardCopy,SForwardEdit,SForwardCopy },
setup(props) {
const globalData = injectGlobalData();
@@ -164,8 +157,6 @@ export default {
.home-list-wrap{
padding:1rem;
- .green{color:green;}
-
.page{padding-top:1rem}
.page-wrap{
display:inline-block;
diff --git a/linker.web/src/views/devices/Oper.vue b/linker.web/src/views/devices/Oper.vue
new file mode 100644
index 00000000..0e5a237b
--- /dev/null
+++ b/linker.web/src/views/devices/Oper.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+ 重启
+ 删除
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/linker.web/src/views/devices/SForwardEdit.vue b/linker.web/src/views/devices/SForwardEdit.vue
index e16a04fd..76c7b8b0 100644
--- a/linker.web/src/views/devices/SForwardEdit.vue
+++ b/linker.web/src/views/devices/SForwardEdit.vue
@@ -89,13 +89,13 @@
import { onMounted, onUnmounted, reactive, watch } from 'vue';
import { getSForwardInfo, removeSForwardInfo, addSForwardInfo,testLocalSForwardInfo } from '@/apis/sforward'
import { ElMessage } from 'element-plus';
-import {WarnTriangleFilled} from '@element-plus/icons-vue'
+import {WarnTriangleFilled,Delete} from '@element-plus/icons-vue'
import { injectGlobalData } from '@/provide';
import { useSforward } from './sforward';
export default {
props: ['data','modelValue'],
emits: ['update:modelValue'],
- components:{WarnTriangleFilled},
+ components:{WarnTriangleFilled,Delete},
setup(props, { emit }) {
const globalData = injectGlobalData();
diff --git a/linker.web/src/views/devices/Tunnel.vue b/linker.web/src/views/devices/Tunnel.vue
index ceded5b4..77186e8d 100644
--- a/linker.web/src/views/devices/Tunnel.vue
+++ b/linker.web/src/views/devices/Tunnel.vue
@@ -2,17 +2,18 @@
-
+
@@ -54,6 +55,6 @@ export default {
}
\ No newline at end of file
diff --git a/linker.web/src/views/devices/TunnelEdit.vue b/linker.web/src/views/devices/TunnelEdit.vue
index bd129c93..55fc6f61 100644
--- a/linker.web/src/views/devices/TunnelEdit.vue
+++ b/linker.web/src/views/devices/TunnelEdit.vue
@@ -82,6 +82,5 @@ export default {
}
\ No newline at end of file
diff --git a/linker.web/src/views/devices/Tuntap.vue b/linker.web/src/views/devices/Tuntap.vue
index 7ccd35dc..7a62632b 100644
--- a/linker.web/src/views/devices/Tuntap.vue
+++ b/linker.web/src/views/devices/Tuntap.vue
@@ -9,7 +9,7 @@
- {{ tuntap.list[scope.row.MachineId].IP }}
+ {{ tuntap.list[scope.row.MachineId].IP }}
@@ -67,8 +67,6 @@ export default {
}
\ No newline at end of file
diff --git a/linker.web/src/views/devices/devices.js b/linker.web/src/views/devices/devices.js
index ae886811..9f41dec3 100644
--- a/linker.web/src/views/devices/devices.js
+++ b/linker.web/src/views/devices/devices.js
@@ -25,6 +25,7 @@ export const provideDevices = () => {
devices.page.Count = res.Count;
for (let j in res.List) {
res.List[j].showDel = machineId.value != res.List[j].MachineId && res.List[j].Connected == false;
+ res.List[j].showReboot = res.List[j].Connected;
res.List[j].isSelf = machineId.value == res.List[j].MachineId;
}
devices.page.List = res.List.sort((a, b) => b.Connected - a.Connected);
@@ -41,6 +42,7 @@ export const provideDevices = () => {
item.LastSignIn = res.List[j].LastSignIn;
item.Args = res.List[j].Args;
item.showDel = machineId.value != res.List[j].MachineId && res.List[j].Connected == false;
+ item.showReboot = res.List[j].Connected;
item.isSelf = machineId.value == res.List[j].MachineId;
}
}
diff --git a/linker.web/src/views/devices/updater.js b/linker.web/src/views/devices/updater.js
index 1fcfaaa9..c68a745c 100644
--- a/linker.web/src/views/devices/updater.js
+++ b/linker.web/src/views/devices/updater.js
@@ -8,18 +8,21 @@ export const provideUpdater = () => {
const updater = ref({
timer: 0,
list: {},
- current: { Version: '', Status: 0, Length: 0, Current: 0 }
+ current: { Version: '', Msg: [], DateTime: '', Status: 0, Length: 0, Current: 0 }
});
provide(updaterSymbol, updater);
const _getUpdater = () => {
if (globalData.value.api.connected) {
getUpdater().then((res) => {
+ console.log(res);
const self = Object.values(res).filter(c => !!c.Version)[0];
if (self) {
+ updater.value.current.DateTime = self.DateTime;
updater.value.current.Version = self.Version;
updater.value.current.Status = self.Status;
updater.value.current.Length = self.Length;
updater.value.current.Current = self.Current;
+ updater.value.current.Msg = self.Msg;
}
updater.value.list = res;
updater.value.timer = setTimeout(_getUpdater, 800);
diff --git a/linker.web/src/views/settings/ExcludeIP.vue b/linker.web/src/views/settings/ExcludeIP.vue
index 8653d326..d4209a41 100644
--- a/linker.web/src/views/settings/ExcludeIP.vue
+++ b/linker.web/src/views/settings/ExcludeIP.vue
@@ -45,11 +45,12 @@ import { injectGlobalData } from '@/provide';
import { ElMessage } from 'element-plus';
import { computed, inject, onMounted, reactive } from 'vue'
import Version from './Version.vue';
+import { Delete,Plus } from '@element-plus/icons-vue';
export default {
label:'打洞排除IP',
name:'excludeIP',
order:3,
- components:{Version},
+ components:{Version,Delete,Plus},
setup(props) {
const globalData = injectGlobalData();
const state = reactive({
diff --git a/linker.web/src/views/settings/RelayServers.vue b/linker.web/src/views/settings/RelayServers.vue
index 69fcf60b..785cc1a2 100644
--- a/linker.web/src/views/settings/RelayServers.vue
+++ b/linker.web/src/views/settings/RelayServers.vue
@@ -83,11 +83,12 @@ import { injectGlobalData } from '@/provide';
import { ElMessage } from 'element-plus';
import { computed, inject, onMounted, reactive } from 'vue'
import Version from './Version.vue';
+import { Delete,Plus,Top,Bottom } from '@element-plus/icons-vue';
export default {
label:'中继服务器',
name:'relayServers',
order:4,
- components:{Version},
+ components:{Version,Delete,Plus,Top,Bottom},
setup(props) {
const globalData = injectGlobalData();
const state = reactive({
diff --git a/linker.web/src/views/settings/SignInServers.vue b/linker.web/src/views/settings/SignInServers.vue
index 9e55f859..0d7f4b3d 100644
--- a/linker.web/src/views/settings/SignInServers.vue
+++ b/linker.web/src/views/settings/SignInServers.vue
@@ -52,11 +52,12 @@ import { injectGlobalData } from '@/provide';
import { ElMessage } from 'element-plus';
import { computed, inject, reactive } from 'vue'
import Version from './Version.vue';
+import { Delete,Plus,Select } from '@element-plus/icons-vue';
export default {
label:'信标服务器',
name:'signInServers',
order:0,
- components:{Version},
+ components:{Version,Delete,Plus,Select },
setup(props) {
const globalData = injectGlobalData();
const state = reactive({
diff --git a/linker.web/src/views/settings/Transports.vue b/linker.web/src/views/settings/Transports.vue
index 8ea60708..813a3c9f 100644
--- a/linker.web/src/views/settings/Transports.vue
+++ b/linker.web/src/views/settings/Transports.vue
@@ -46,11 +46,12 @@ import { injectGlobalData } from '@/provide';
import { ElMessage } from 'element-plus';
import { computed, inject, onMounted, reactive } from 'vue'
import Version from './Version.vue';
+import { Delete,Plus,Top,Bottom } from '@element-plus/icons-vue';
export default {
label:'打洞协议',
name:'transports',
order:2,
- components:{Version},
+ components:{Version, Delete,Plus,Top,Bottom},
setup(props) {
const globalData = injectGlobalData();
const state = reactive({
diff --git a/linker.web/src/views/settings/TunnelServers.vue b/linker.web/src/views/settings/TunnelServers.vue
index 26e9e90b..9e4b0f85 100644
--- a/linker.web/src/views/settings/TunnelServers.vue
+++ b/linker.web/src/views/settings/TunnelServers.vue
@@ -78,13 +78,14 @@
import { setTunnelServers,getTunnelTypes } from '@/apis/tunnel';
import { injectGlobalData } from '@/provide';
import { ElMessage } from 'element-plus';
-import { computed, inject, onMounted, reactive } from 'vue'
+import { computed, onMounted, reactive } from 'vue'
import Version from './Version.vue';
+import { Delete,Plus,Top,Bottom } from '@element-plus/icons-vue';
export default {
label:'端口服务器',
name:'tunnelServers',
order:1,
- components:{Version},
+ components:{Version,Delete,Plus,Top,Bottom},
setup(props) {
const globalData = injectGlobalData();
const list = ((globalData.value.config.Running.Tunnel || {Servers:[]}).Servers || []).sort((a,b)=>a.Disabled - b.Disabled);
diff --git a/linker/linker.csproj b/linker/linker.csproj
index 542615f7..c25fa421 100644
--- a/linker/linker.csproj
+++ b/linker/linker.csproj
@@ -25,8 +25,8 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker
-
1.1.2.2
-
1.1.2.2
+
1.1.2.3
+
1.1.2.3
diff --git a/linker/plugins/capi/ApiClientServer.cs b/linker/plugins/capi/ApiClientServer.cs
index a125b295..c6c71bf7 100644
--- a/linker/plugins/capi/ApiClientServer.cs
+++ b/linker/plugins/capi/ApiClientServer.cs
@@ -1,5 +1,4 @@
-using linker.client.capi;
-using linker.config;
+using linker.config;
using linker.libs;
using linker.libs.api;
using Microsoft.Extensions.DependencyInjection;
diff --git a/linker/plugins/capi/CApiStartup.cs b/linker/plugins/capi/CApiStartup.cs
index c3909b4a..c3b488ec 100644
--- a/linker/plugins/capi/CApiStartup.cs
+++ b/linker/plugins/capi/CApiStartup.cs
@@ -1,5 +1,4 @@
-using linker.client.capi;
-using linker.config;
+using linker.config;
using linker.startup;
using linker.libs;
using Microsoft.Extensions.DependencyInjection;
diff --git a/linker/client/capi/IApiClientController.cs b/linker/plugins/capi/IApiClientController.cs
similarity index 89%
rename from linker/client/capi/IApiClientController.cs
rename to linker/plugins/capi/IApiClientController.cs
index 625913c5..8cc45118 100644
--- a/linker/client/capi/IApiClientController.cs
+++ b/linker/plugins/capi/IApiClientController.cs
@@ -1,7 +1,7 @@
using linker.libs.api;
using System.Reflection;
-namespace linker.client.capi
+namespace linker.plugins.capi
{
public interface IApiClientController : IApiController
{
diff --git a/linker/client/ClientSignInState.cs b/linker/plugins/client/ClientSignInState.cs
similarity index 94%
rename from linker/client/ClientSignInState.cs
rename to linker/plugins/client/ClientSignInState.cs
index 749bad0f..ec39b3ee 100644
--- a/linker/client/ClientSignInState.cs
+++ b/linker/plugins/client/ClientSignInState.cs
@@ -1,7 +1,7 @@
-using linker.server;
+using linker.plugins.messenger;
using System.Text.Json.Serialization;
-namespace linker.client
+namespace linker.plugins.client
{
///
/// 登入对象
diff --git a/linker/client/ClientSignInTransfer.cs b/linker/plugins/client/ClientSignInTransfer.cs
similarity index 93%
rename from linker/client/ClientSignInTransfer.cs
rename to linker/plugins/client/ClientSignInTransfer.cs
index 49989db7..486106b5 100644
--- a/linker/client/ClientSignInTransfer.cs
+++ b/linker/plugins/client/ClientSignInTransfer.cs
@@ -1,15 +1,16 @@
-using linker.client.args;
-using linker.client.config;
+using linker.client.config;
using linker.config;
using linker.plugins.signin.messenger;
-using linker.server;
using linker.libs;
using linker.libs.extends;
using MemoryPack;
using System.Net;
using System.Net.Sockets;
+using linker.plugins.client.args;
+using linker.plugins.server;
+using linker.plugins.messenger;
-namespace linker.client
+namespace linker.plugins.client
{
///
/// 登入
@@ -19,20 +20,20 @@ namespace linker.client
private readonly ClientSignInState clientSignInState;
private readonly RunningConfig runningConfig;
private readonly FileConfig config;
- private readonly TcpServer tcpServer;
private readonly MessengerSender messengerSender;
+ private readonly MessengerResolver messengerResolver;
private readonly SignInArgsTransfer signInArgsTransfer;
private readonly RunningConfigTransfer runningConfigTransfer;
private string configKey = "signServers";
- public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, FileConfig config, TcpServer tcpServer, MessengerSender messengerSender, SignInArgsTransfer signInArgsTransfer, RunningConfigTransfer runningConfigTransfer)
+ public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, FileConfig config, MessengerSender messengerSender, MessengerResolver messengerResolver, SignInArgsTransfer signInArgsTransfer, RunningConfigTransfer runningConfigTransfer)
{
this.clientSignInState = clientSignInState;
this.runningConfig = runningConfig;
this.config = config;
- this.tcpServer = tcpServer;
this.messengerSender = messengerSender;
+ this.messengerResolver = messengerResolver;
this.signInArgsTransfer = signInArgsTransfer;
this.runningConfigTransfer = runningConfigTransfer;
@@ -131,7 +132,7 @@ namespace linker.client
Socket socket = new Socket(remote.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.KeepAlive();
await socket.ConnectAsync(remote).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
- clientSignInState.Connection = await tcpServer.BeginReceive(socket).ConfigureAwait(false);
+ clientSignInState.Connection = await messengerResolver.BeginReceiveClient(socket).ConfigureAwait(false);
return true;
}
@@ -169,6 +170,16 @@ namespace linker.client
clientSignInState.Connection?.Disponse(6);
return false;
}
+
+ ///
+ /// 登出
+ ///
+ public void SignOut()
+ {
+ if (clientSignInState.Connected)
+ clientSignInState.Connection.Disponse(5);
+ }
+
///
/// 获取服务器版本
///
@@ -189,14 +200,7 @@ namespace linker.client
clientSignInState.Version = "v1.0.0.0";
}
}
- ///
- /// 登出
- ///
- public void SignOut()
- {
- if (clientSignInState.Connected)
- clientSignInState.Connection.Disponse(5);
- }
+
///
/// 修改客户端名称
diff --git a/linker/client/ClientStartup.cs b/linker/plugins/client/ClientStartup.cs
similarity index 72%
rename from linker/client/ClientStartup.cs
rename to linker/plugins/client/ClientStartup.cs
index 4c227968..8cb1f46b 100644
--- a/linker/client/ClientStartup.cs
+++ b/linker/plugins/client/ClientStartup.cs
@@ -2,12 +2,10 @@
using linker.startup;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
-using linker.client.args;
-using linker.client.config;
using linker.config;
-using linker.client.config.messenger;
+using linker.plugins.client.args;
-namespace linker.client
+namespace linker.plugins.client
{
///
/// 客户端插件
@@ -17,16 +15,11 @@ namespace linker.client
public StartupLevel Level => StartupLevel.Bottom;
public string Name => "client";
public bool Required => true;
- public string[] Dependent => new string[] { "firewall", "signin", "serialize" };
+ public string[] Dependent => new string[] { "messenger", "firewall", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
{
- serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
-
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
@@ -46,7 +39,7 @@ namespace linker.client
public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
{
- serviceCollection.AddSingleton();
+
}
public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies)
{
diff --git a/linker/client/args/ISignInArgs.cs b/linker/plugins/client/args/ISignInArgs.cs
similarity index 73%
rename from linker/client/args/ISignInArgs.cs
rename to linker/plugins/client/args/ISignInArgs.cs
index fc59a772..cd176269 100644
--- a/linker/client/args/ISignInArgs.cs
+++ b/linker/plugins/client/args/ISignInArgs.cs
@@ -1,4 +1,4 @@
-namespace linker.client.args
+namespace linker.plugins.client.args
{
public interface ISignInArgs
{
diff --git a/linker/client/args/SignInArgsTransfer.cs b/linker/plugins/client/args/SignInArgsTransfer.cs
similarity index 87%
rename from linker/client/args/SignInArgsTransfer.cs
rename to linker/plugins/client/args/SignInArgsTransfer.cs
index 36eaf10e..84630fdb 100644
--- a/linker/client/args/SignInArgsTransfer.cs
+++ b/linker/plugins/client/args/SignInArgsTransfer.cs
@@ -3,7 +3,7 @@ using linker.libs;
using Microsoft.Extensions.DependencyInjection;
using System;
-namespace linker.client.args
+namespace linker.plugins.client.args
{
public sealed class SignInArgsTransfer
{
@@ -12,7 +12,7 @@ namespace linker.client.args
public SignInArgsTransfer(ServiceProvider serviceProvider, FileConfig config)
{
var types = ReflectionHelper.GetInterfaceSchieves(typeof(ISignInArgs));
- startups = types.Select(c => serviceProvider.GetService(c) as ISignInArgs).Where(c=>c != null).ToList();
+ startups = types.Select(c => serviceProvider.GetService(c) as ISignInArgs).Where(c => c != null).ToList();
}
public void Invoke(Dictionary args)
diff --git a/linker/client/config/Config.cs b/linker/plugins/client/config/Config.cs
similarity index 100%
rename from linker/client/config/Config.cs
rename to linker/plugins/client/config/Config.cs
diff --git a/linker/plugins/config/ConfigApiController.cs b/linker/plugins/config/ConfigApiController.cs
index 531b497b..c29c1a68 100644
--- a/linker/plugins/config/ConfigApiController.cs
+++ b/linker/plugins/config/ConfigApiController.cs
@@ -1,8 +1,8 @@
using linker.config;
using linker.libs.api;
using linker.libs.extends;
-using linker.client.capi;
using linker.client.config;
+using linker.plugins.capi;
namespace linker.plugins.config
{
diff --git a/linker/plugins/config/ConfigStartup.cs b/linker/plugins/config/ConfigStartup.cs
index 0351c433..2e99d81a 100644
--- a/linker/plugins/config/ConfigStartup.cs
+++ b/linker/plugins/config/ConfigStartup.cs
@@ -1,4 +1,6 @@
-using linker.config;
+using linker.client.config;
+using linker.config;
+using linker.plugins.config.messenger;
using linker.startup;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
@@ -11,19 +13,26 @@ namespace linker.plugins.config
public bool Required => true;
- public StartupLevel Level => StartupLevel.Normal;
+ public StartupLevel Level => StartupLevel.Normal;
- public string[] Dependent => Array.Empty();
+ public string[] Dependent => new string[] { "messenger", "signin", "serialize" };
- public StartupLoadType LoadType => StartupLoadType.Normal;
+ public StartupLoadType LoadType => StartupLoadType.Normal;
public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
{
serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
{
+ serviceCollection.AddSingleton();
}
public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies)
diff --git a/linker/client/config/RunningConfig.cs b/linker/plugins/config/RunningConfig.cs
similarity index 100%
rename from linker/client/config/RunningConfig.cs
rename to linker/plugins/config/RunningConfig.cs
diff --git a/linker/client/config/RunningConfigApiController.cs b/linker/plugins/config/RunningConfigApiController.cs
similarity index 81%
rename from linker/client/config/RunningConfigApiController.cs
rename to linker/plugins/config/RunningConfigApiController.cs
index 94749e51..e913eb42 100644
--- a/linker/client/config/RunningConfigApiController.cs
+++ b/linker/plugins/config/RunningConfigApiController.cs
@@ -1,12 +1,13 @@
using linker.libs.api;
-using linker.client.capi;
using linker.libs.extends;
+using linker.client.config;
+using linker.plugins.capi;
-namespace linker.client.config
+namespace linker.plugins.config
{
public sealed class RunningConfigApiController : IApiClientController
{
- private readonly RunningConfigTransfer runningConfigTransfer;
+ private readonly RunningConfigTransfer runningConfigTransfer;
public RunningConfigApiController(RunningConfigTransfer runningConfigTransfer)
{
diff --git a/linker/client/config/RunningConfigTransfer.cs b/linker/plugins/config/RunningConfigTransfer.cs
similarity index 97%
rename from linker/client/config/RunningConfigTransfer.cs
rename to linker/plugins/config/RunningConfigTransfer.cs
index c2f0497d..a3f273a5 100644
--- a/linker/client/config/RunningConfigTransfer.cs
+++ b/linker/plugins/config/RunningConfigTransfer.cs
@@ -1,6 +1,7 @@
-using linker.client.config.messenger;
-using linker.libs;
-using linker.server;
+using linker.libs;
+using linker.plugins.client;
+using linker.plugins.config.messenger;
+using linker.plugins.messenger;
using MemoryPack;
using System.Collections.Concurrent;
@@ -30,6 +31,7 @@ namespace linker.client.config
///
public Memory Data { get; set; }
}
+
///
/// 配置同步
///
diff --git a/linker/client/config/messenger/ConfigMessenger.cs b/linker/plugins/config/messenger/ConfigMessenger.cs
similarity index 95%
rename from linker/client/config/messenger/ConfigMessenger.cs
rename to linker/plugins/config/messenger/ConfigMessenger.cs
index daebd6af..08a99fbd 100644
--- a/linker/client/config/messenger/ConfigMessenger.cs
+++ b/linker/plugins/config/messenger/ConfigMessenger.cs
@@ -1,8 +1,9 @@
-using linker.plugins.signin.messenger;
-using linker.server;
+using linker.client.config;
+using linker.plugins.messenger;
+using linker.plugins.signin.messenger;
using MemoryPack;
-namespace linker.client.config.messenger
+namespace linker.plugins.config.messenger
{
public sealed class ConfigServerMessenger : IMessenger
{
diff --git a/linker/client/config/messenger/ConfigMessengerIds.cs b/linker/plugins/config/messenger/ConfigMessengerIds.cs
similarity index 77%
rename from linker/client/config/messenger/ConfigMessengerIds.cs
rename to linker/plugins/config/messenger/ConfigMessengerIds.cs
index a0df61b5..1b6b510c 100644
--- a/linker/client/config/messenger/ConfigMessengerIds.cs
+++ b/linker/plugins/config/messenger/ConfigMessengerIds.cs
@@ -1,4 +1,4 @@
-namespace linker.client.config.messenger
+namespace linker.plugins.config.messenger
{
public enum ConfigMessengerIds : ushort
{
diff --git a/linker/plugins/forward/ForwardApiController.cs b/linker/plugins/forward/ForwardApiController.cs
index da19c4ac..f58a6205 100644
--- a/linker/plugins/forward/ForwardApiController.cs
+++ b/linker/plugins/forward/ForwardApiController.cs
@@ -1,6 +1,5 @@
using linker.libs.api;
using linker.libs.extends;
-using linker.client.capi;
using linker.client.config;
using System.Net;
using linker.libs;
@@ -8,9 +7,10 @@ using linker.plugins.forward.proxy;
using linker.tunnel.connection;
using System.Collections.Concurrent;
using linker.plugins.forward.messenger;
-using linker.server;
-using linker.client;
using MemoryPack;
+using linker.plugins.client;
+using linker.plugins.capi;
+using linker.plugins.messenger;
namespace linker.plugins.forward
{
diff --git a/linker/plugins/forward/ForwardStartup.cs b/linker/plugins/forward/ForwardStartup.cs
index 2c29ca2b..e2fe00f2 100644
--- a/linker/plugins/forward/ForwardStartup.cs
+++ b/linker/plugins/forward/ForwardStartup.cs
@@ -12,7 +12,7 @@ namespace linker.plugins.forward
public StartupLevel Level => StartupLevel.Normal;
public string Name => "forward";
public bool Required => false;
- public string[] Dependent => new string[] { "relay", "tunnel" };
+ public string[] Dependent => new string[] { "messenger", "relay", "tunnel", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
diff --git a/linker/plugins/forward/ForwardTransfer.cs b/linker/plugins/forward/ForwardTransfer.cs
index 52e830ea..aadc179e 100644
--- a/linker/plugins/forward/ForwardTransfer.cs
+++ b/linker/plugins/forward/ForwardTransfer.cs
@@ -1,10 +1,10 @@
-using linker.client;
-using linker.client.config;
+using linker.client.config;
using linker.libs;
using linker.libs.extends;
+using linker.plugins.client;
using linker.plugins.forward.messenger;
using linker.plugins.forward.proxy;
-using linker.server;
+using linker.plugins.messenger;
using MemoryPack;
using System.Collections.Concurrent;
using System.Net;
diff --git a/linker/plugins/forward/messenger/ForwardMessenger.cs b/linker/plugins/forward/messenger/ForwardMessenger.cs
index ed8d98f0..a0c8a40d 100644
--- a/linker/plugins/forward/messenger/ForwardMessenger.cs
+++ b/linker/plugins/forward/messenger/ForwardMessenger.cs
@@ -1,6 +1,6 @@
using linker.client.config;
+using linker.plugins.messenger;
using linker.plugins.signin.messenger;
-using linker.server;
using LiteDB;
using MemoryPack;
using System.Net;
diff --git a/linker/plugins/logger/LoggerController.cs b/linker/plugins/logger/LoggerController.cs
index c3338ea6..7040ea3e 100644
--- a/linker/plugins/logger/LoggerController.cs
+++ b/linker/plugins/logger/LoggerController.cs
@@ -2,7 +2,7 @@
using linker.libs.api;
using linker.libs;
using linker.config;
-using linker.client.capi;
+using linker.plugins.capi;
namespace linker.plugins.logger
{
diff --git a/linker/server/IConnection.cs b/linker/plugins/messenger/IConnection.cs
similarity index 98%
rename from linker/server/IConnection.cs
rename to linker/plugins/messenger/IConnection.cs
index 97447b0f..3d13c07e 100644
--- a/linker/server/IConnection.cs
+++ b/linker/plugins/messenger/IConnection.cs
@@ -6,7 +6,7 @@ using System.Net.Security;
using System.Net.Sockets;
using System.Text;
-namespace linker.server
+namespace linker.plugins.messenger
{
public interface IConnectionReceiveCallback
{
@@ -405,7 +405,7 @@ namespace linker.server
{
try
{
- await callback.Receive(this, packet, this.userToken).ConfigureAwait(false);
+ await callback.Receive(this, packet, userToken).ConfigureAwait(false);
}
catch (Exception)
{
@@ -422,7 +422,7 @@ namespace linker.server
if (Environment.TickCount64 - ticks > 3000)
{
pingStart = Environment.TickCount64;
- await SendPingPong(pingBytes).ConfigureAwait(false);
+ await SendPingPong(pingBytes).ConfigureAwait(false);
}
await Task.Delay(3000).ConfigureAwait(false);
@@ -442,7 +442,7 @@ namespace linker.server
data.Length.ToBytes(heartData);
data.AsMemory().CopyTo(heartData.AsMemory(4));
- await semaphoreSlim.WaitAsync().ConfigureAwait(false);
+ await semaphoreSlim.WaitAsync().ConfigureAwait(false);
try
{
if (SourceStream != null)
@@ -451,7 +451,7 @@ namespace linker.server
}
else
{
- await SourceSocket.SendAsync(heartData.AsMemory(0, length), cancellationTokenSource.Token).ConfigureAwait(false);
+ await SourceSocket.SendAsync(heartData.AsMemory(0, length), cancellationTokenSource.Token).ConfigureAwait(false);
}
}
@@ -481,7 +481,7 @@ namespace linker.server
if (SourceStream != null)
await SourceStream.WriteAsync(data, cancellationTokenSourceWrite.Token).ConfigureAwait(false);
else
- await SourceSocket.SendAsync(data, cancellationTokenSourceWrite.Token).ConfigureAwait(false);
+ await SourceSocket.SendAsync(data, cancellationTokenSourceWrite.Token).ConfigureAwait(false);
SendBytes += data.Length;
ticks = Environment.TickCount64;
}
@@ -505,7 +505,7 @@ namespace linker.server
}
public override async Task SendAsync(byte[] data, int length)
{
- return await SendAsync(data.AsMemory(0, length)).ConfigureAwait(false);
+ return await SendAsync(data.AsMemory(0, length)).ConfigureAwait(false);
}
public override async Task RelayAsync(byte bufferSize)
@@ -529,7 +529,7 @@ namespace linker.server
TryLimit(ref length);
while (length > 0)
{
- await Task.Delay(30).ConfigureAwait(false);
+ await Task.Delay(30).ConfigureAwait(false);
TryLimit(ref length);
}
}
diff --git a/linker/server/IMessenger.cs b/linker/plugins/messenger/IMessenger.cs
similarity index 93%
rename from linker/server/IMessenger.cs
rename to linker/plugins/messenger/IMessenger.cs
index a763cb78..fe415013 100644
--- a/linker/server/IMessenger.cs
+++ b/linker/plugins/messenger/IMessenger.cs
@@ -1,4 +1,4 @@
-namespace linker.server
+namespace linker.plugins.messenger
{
///
/// 消息接口
diff --git a/linker/server/MessengerResolver.cs b/linker/plugins/messenger/MessengerResolver.cs
similarity index 54%
rename from linker/server/MessengerResolver.cs
rename to linker/plugins/messenger/MessengerResolver.cs
index c6233675..3d4127b8 100644
--- a/linker/server/MessengerResolver.cs
+++ b/linker/plugins/messenger/MessengerResolver.cs
@@ -1,8 +1,15 @@
using linker.libs;
using Microsoft.Extensions.DependencyInjection;
+using System.Net.Security;
+using System.Net.Sockets;
+using System.Net;
using System.Reflection;
+using System.Security.Authentication;
+using System.Security.Cryptography.X509Certificates;
+using System.Buffers;
+using linker.libs.extends;
-namespace linker.server
+namespace linker.plugins.messenger
{
///
/// 消息处理总线
@@ -17,12 +24,135 @@ namespace linker.server
private readonly MessengerSender messengerSender;
private readonly ServiceProvider serviceProvider;
+ private X509Certificate serverCertificate;
public MessengerResolver(MessengerSender messengerSender, ServiceProvider serviceProvider)
{
this.messengerSender = messengerSender;
this.serviceProvider = serviceProvider;
}
+ public void Init(string certificate, string password)
+ {
+ string path = Path.GetFullPath(certificate);
+ if (File.Exists(path))
+ {
+ serverCertificate = new X509Certificate(path, password);
+ }
+ else
+ {
+ LoggerHelper.Instance.Error($"file {path} not found");
+ Environment.Exit(0);
+ }
+ }
+ public async Task BeginReceiveServer(Socket socket)
+ {
+ try
+ {
+ if (socket == null || socket.RemoteEndPoint == null)
+ {
+ return;
+ }
+ socket.KeepAlive();
+
+ if (await ReceiveType(socket).ConfigureAwait(false) == 0)
+ {
+ return;
+ }
+
+ NetworkStream networkStream = new NetworkStream(socket, false);
+ SslStream sslStream = new SslStream(networkStream, true);
+ await sslStream.AuthenticateAsServerAsync(serverCertificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
+ IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint);
+
+ connection.BeginReceive(this, null, true);
+ }
+ catch (Exception ex)
+ {
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ LoggerHelper.Instance.Error(ex);
+ }
+ }
+ public async Task BeginReceiveClient(Socket socket)
+ {
+ try
+ {
+ if (socket == null || socket.RemoteEndPoint == null)
+ {
+ return null;
+ }
+ socket.KeepAlive();
+ await socket.SendAsync(new byte[] { 1 }).ConfigureAwait(false);
+ NetworkStream networkStream = new NetworkStream(socket, false);
+ SslStream sslStream = new SslStream(networkStream, true, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
+ await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions
+ {
+ AllowRenegotiation = true,
+ EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13
+ }).ConfigureAwait(false);
+ IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint);
+
+ connection.BeginReceive(this, null, true);
+
+ return connection;
+ }
+ catch (Exception ex)
+ {
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ LoggerHelper.Instance.Error(ex);
+ }
+ return null;
+ }
+ private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
+ {
+ return true;
+ }
+ private IConnection CreateConnection(SslStream stream, NetworkStream networkStream, Socket socket, IPEndPoint local, IPEndPoint remote)
+ {
+ return new TcpConnection(stream, networkStream, socket, local, remote)
+ {
+ ReceiveRequestWrap = new MessageRequestWrap(),
+ ReceiveResponseWrap = new MessageResponseWrap()
+ };
+ }
+ public Memory BuildSendData(byte[] data, IPEndPoint ep)
+ {
+ //给客户端返回他的IP+端口
+ data[0] = (byte)ep.AddressFamily;
+ ep.Address.TryWriteBytes(data.AsSpan(1), out int length);
+ ((ushort)ep.Port).ToBytes(data.AsMemory(1 + length));
+
+ //防止一些网关修改掉它的外网IP
+ for (int i = 0; i < 1 + length + 2; i++)
+ {
+ data[i] = (byte)(data[i] ^ byte.MaxValue);
+ }
+ return data.AsMemory(0, 1 + length + 2);
+ }
+ private async Task ReceiveType(Socket socket)
+ {
+ byte[] sendData = ArrayPool.Shared.Rent(20);
+ try
+ {
+ await socket.ReceiveAsync(sendData.AsMemory(0, 1), SocketFlags.None).ConfigureAwait(false);
+ byte type = sendData[0];
+ if (type == 0)
+ {
+ Memory memory = BuildSendData(sendData, socket.RemoteEndPoint as IPEndPoint);
+ await socket.SendAsync(memory, SocketFlags.None).ConfigureAwait(false);
+ }
+ return type;
+ }
+ catch (Exception)
+ {
+ }
+ finally
+ {
+ ArrayPool.Shared.Return(sendData);
+ }
+ return 1;
+ }
+
+
///
/// 加载所有消息处理器
///
diff --git a/linker/server/MessengerSender.cs b/linker/plugins/messenger/MessengerSender.cs
similarity index 99%
rename from linker/server/MessengerSender.cs
rename to linker/plugins/messenger/MessengerSender.cs
index 06326fd0..22766426 100644
--- a/linker/server/MessengerSender.cs
+++ b/linker/plugins/messenger/MessengerSender.cs
@@ -1,7 +1,7 @@
using linker.libs;
using System.Collections.Concurrent;
-namespace linker.server
+namespace linker.plugins.messenger
{
///
/// 消息发送器
diff --git a/linker/server/ServerStartup.cs b/linker/plugins/messenger/MessengerStartup.cs
similarity index 62%
rename from linker/server/ServerStartup.cs
rename to linker/plugins/messenger/MessengerStartup.cs
index 5f7e1b57..6c730865 100644
--- a/linker/server/ServerStartup.cs
+++ b/linker/plugins/messenger/MessengerStartup.cs
@@ -1,34 +1,31 @@
using linker.config;
using linker.startup;
-using linker.libs;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
-namespace linker.server
+namespace linker.plugins.messenger
{
///
/// 服务端插件
///
- public sealed class ServerStartup : IStartup
+ public sealed class MessengerStartup : IStartup
{
public StartupLevel Level => StartupLevel.Normal;
- public string Name => "server";
+ public string Name => "messenger";
public bool Required => true;
- public string[] Dependent => new string[] { "serialize", "firewall", "signin" };
+ public string[] Dependent => new string[] { };
public StartupLoadType LoadType => StartupLoadType.Normal;
public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
{
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
{
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
}
@@ -40,6 +37,7 @@ namespace linker.server
{
MessengerResolver messengerResolver = serviceProvider.GetService();
messengerResolver.LoadMessenger(assemblies);
+ messengerResolver.Init(config.Data.Server.Certificate, config.Data.Server.Password);
loaded = true;
}
}
@@ -50,26 +48,9 @@ namespace linker.server
{
MessengerResolver messengerResolver = serviceProvider.GetService();
messengerResolver.LoadMessenger(assemblies);
+ messengerResolver.Init(config.Data.Server.Certificate, config.Data.Server.Password);
loaded = true;
}
-
- LoggerHelper.Instance.Info($"start server");
- try
- {
- //服务
- TcpServer tcpServer = serviceProvider.GetService();
- tcpServer.Init(config.Data.Server.Certificate, config.Data.Server.Password);
- if(config.Data.Server.ServicePort > 0)
- {
- tcpServer.Start(config.Data.Server.ServicePort);
- }
- }
- catch (Exception ex)
- {
- LoggerHelper.Instance.Error(ex);
- }
- LoggerHelper.Instance.Info($"server listen:{config.Data.Server.ServicePort}");
-
}
}
}
diff --git a/linker/server/ServerMessageWrap.cs b/linker/plugins/messenger/MessengerWrap.cs
similarity index 99%
rename from linker/server/ServerMessageWrap.cs
rename to linker/plugins/messenger/MessengerWrap.cs
index fe80367c..5d3a7fd0 100644
--- a/linker/server/ServerMessageWrap.cs
+++ b/linker/plugins/messenger/MessengerWrap.cs
@@ -2,7 +2,7 @@
using System.Buffers;
using System.ComponentModel;
-namespace linker.server
+namespace linker.plugins.messenger
{
///
/// 请求数据包
diff --git a/linker/plugins/relay/RelayApiController.cs b/linker/plugins/relay/RelayApiController.cs
index beff547c..752e7129 100644
--- a/linker/plugins/relay/RelayApiController.cs
+++ b/linker/plugins/relay/RelayApiController.cs
@@ -1,11 +1,11 @@
-using linker.client;
-using linker.client.capi;
-using linker.config;
+using linker.config;
using linker.plugins.relay.messenger;
-using linker.server;
using linker.libs.api;
using linker.libs.extends;
using MemoryPack;
+using linker.plugins.client;
+using linker.plugins.capi;
+using linker.plugins.messenger;
namespace linker.plugins.relay
{
diff --git a/linker/plugins/relay/RelayStartup.cs b/linker/plugins/relay/RelayStartup.cs
index adf1f28d..aa81dcde 100644
--- a/linker/plugins/relay/RelayStartup.cs
+++ b/linker/plugins/relay/RelayStartup.cs
@@ -17,7 +17,7 @@ namespace linker.plugins.relay
public bool Required => false;
- public string[] Dependent => new string[] { };
+ public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
diff --git a/linker/plugins/relay/RelayTransfer.cs b/linker/plugins/relay/RelayTransfer.cs
index 69d95134..27f61295 100644
--- a/linker/plugins/relay/RelayTransfer.cs
+++ b/linker/plugins/relay/RelayTransfer.cs
@@ -9,7 +9,7 @@ using System.Collections.Concurrent;
using System.Net;
using System.Reflection;
using MemoryPack;
-using linker.client;
+using linker.plugins.client;
namespace linker.plugins.relay
{
diff --git a/linker/plugins/relay/messenger/RelayMessenger.cs b/linker/plugins/relay/messenger/RelayMessenger.cs
index 7ca8db8e..cecc345b 100644
--- a/linker/plugins/relay/messenger/RelayMessenger.cs
+++ b/linker/plugins/relay/messenger/RelayMessenger.cs
@@ -1,10 +1,11 @@
using linker.config;
using linker.plugins.relay.transport;
using linker.plugins.signin.messenger;
-using linker.server;
using linker.libs;
using MemoryPack;
using System.Collections.Concurrent;
+using linker.plugins.server;
+using linker.plugins.messenger;
namespace linker.plugins.relay.messenger
{
diff --git a/linker/plugins/relay/transport/TransportSelfHost.cs b/linker/plugins/relay/transport/TransportSelfHost.cs
index 44d454e6..122cc9d4 100644
--- a/linker/plugins/relay/transport/TransportSelfHost.cs
+++ b/linker/plugins/relay/transport/TransportSelfHost.cs
@@ -1,6 +1,5 @@
using linker.config;
using linker.plugins.relay.messenger;
-using linker.server;
using linker.tunnel.connection;
using linker.libs;
using linker.libs.extends;
@@ -11,6 +10,8 @@ using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
+using linker.plugins.server;
+using linker.plugins.messenger;
namespace linker.plugins.relay.transport
{
@@ -20,15 +21,15 @@ namespace linker.plugins.relay.transport
public RelayType Type => RelayType.Linker;
public TunnelProtocolType ProtocolType => TunnelProtocolType.Tcp;
- private readonly TcpServer tcpServer;
+ private readonly MessengerResolver messengerResolver;
private readonly MessengerSender messengerSender;
private X509Certificate2 certificate;
- public TransportSelfHost(TcpServer tcpServer, MessengerSender messengerSender, FileConfig config)
+ public TransportSelfHost(MessengerResolver messengerResolver, MessengerSender messengerSender, FileConfig config)
{
- this.tcpServer = tcpServer;
+ this.messengerResolver = messengerResolver;
this.messengerSender = messengerSender;
string path = Path.GetFullPath(config.Data.Client.Certificate);
@@ -46,7 +47,7 @@ namespace linker.plugins.relay.transport
socket.KeepAlive();
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
- IConnection connection = await tcpServer.BeginReceive(socket);
+ IConnection connection = await messengerResolver.BeginReceiveClient(socket);
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = connection,
@@ -114,7 +115,7 @@ namespace linker.plugins.relay.transport
socket.KeepAlive();
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
- IConnection connection = await tcpServer.BeginReceive(socket);
+ IConnection connection = await messengerResolver.BeginReceiveClient(socket);
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = connection,
diff --git a/linker/serializes/IPAddressFormatter.cs b/linker/plugins/serializes/IPAddressFormatter.cs
similarity index 92%
rename from linker/serializes/IPAddressFormatter.cs
rename to linker/plugins/serializes/IPAddressFormatter.cs
index e8289b40..a4822468 100644
--- a/linker/serializes/IPAddressFormatter.cs
+++ b/linker/plugins/serializes/IPAddressFormatter.cs
@@ -1,7 +1,7 @@
using MemoryPack;
using System.Net;
-namespace linker.serializes
+namespace linker.plugins.serializes
{
///
/// MemoryPack 的 IPAddress序列化扩展
@@ -25,7 +25,7 @@ namespace linker.serializes
span[0] = (byte)bytesWritten;
writer.WriteCollectionHeader(bytesWritten + 4);
- writer.WriteSpan(span.Slice(0, bytesWritten+1));
+ writer.WriteSpan(span.Slice(0, bytesWritten + 1));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref IPAddress value)
diff --git a/linker/serializes/IPEndPointFormatter.cs b/linker/plugins/serializes/IPEndPointFormatter.cs
similarity index 97%
rename from linker/serializes/IPEndPointFormatter.cs
rename to linker/plugins/serializes/IPEndPointFormatter.cs
index 30650ec9..35711a09 100644
--- a/linker/serializes/IPEndPointFormatter.cs
+++ b/linker/plugins/serializes/IPEndPointFormatter.cs
@@ -2,7 +2,7 @@
using MemoryPack;
using System.Net;
-namespace linker.serializes
+namespace linker.plugins.serializes
{
///
/// MemoryPack 的 IPEndPoint序列化扩展
diff --git a/linker/serializes/SerializeStartup.cs b/linker/plugins/serializes/SerializeStartup.cs
similarity index 97%
rename from linker/serializes/SerializeStartup.cs
rename to linker/plugins/serializes/SerializeStartup.cs
index e79c227d..7a039c13 100644
--- a/linker/serializes/SerializeStartup.cs
+++ b/linker/plugins/serializes/SerializeStartup.cs
@@ -4,7 +4,7 @@ using MemoryPack;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
-namespace linker.serializes
+namespace linker.plugins.serializes
{
///
/// MemoryPack 序列化扩展加载插件
diff --git a/linker/plugins/server/ServerStartup.cs b/linker/plugins/server/ServerStartup.cs
new file mode 100644
index 00000000..b6a45a82
--- /dev/null
+++ b/linker/plugins/server/ServerStartup.cs
@@ -0,0 +1,53 @@
+using linker.config;
+using linker.startup;
+using linker.libs;
+using Microsoft.Extensions.DependencyInjection;
+using System.Reflection;
+
+namespace linker.plugins.server
+{
+ ///
+ /// 服务端插件
+ ///
+ public sealed class ServerStartup : IStartup
+ {
+ public StartupLevel Level => StartupLevel.Normal;
+ public string Name => "server";
+ public bool Required => true;
+ public string[] Dependent => new string[] {"messenger", "serialize", "firewall", "signin", "config" };
+ public StartupLoadType LoadType => StartupLoadType.Normal;
+
+ public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
+ {
+ }
+
+ public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies)
+ {
+ serviceCollection.AddSingleton();
+ }
+
+ public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies)
+ {
+ }
+
+ public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies)
+ {
+ LoggerHelper.Instance.Info($"start server");
+ try
+ {
+ //服务
+ TcpServer tcpServer = serviceProvider.GetService();
+ if (config.Data.Server.ServicePort > 0)
+ {
+ tcpServer.Start(config.Data.Server.ServicePort);
+ }
+ }
+ catch (Exception ex)
+ {
+ LoggerHelper.Instance.Error(ex);
+ }
+ LoggerHelper.Instance.Info($"server listen:{config.Data.Server.ServicePort}");
+
+ }
+ }
+}
diff --git a/linker/plugins/server/TcpServer.cs b/linker/plugins/server/TcpServer.cs
new file mode 100644
index 00000000..d05f512d
--- /dev/null
+++ b/linker/plugins/server/TcpServer.cs
@@ -0,0 +1,127 @@
+using linker.libs.extends;
+using linker.plugins.messenger;
+using System.Net;
+using System.Net.Sockets;
+
+namespace linker.plugins.server
+{
+ public sealed class TcpServer
+ {
+ private Socket socket;
+ private Socket socketUdp;
+ private CancellationTokenSource cancellationTokenSource;
+ private readonly MessengerResolver messengerResolver;
+
+ public TcpServer(MessengerResolver messengerResolver)
+ {
+ this.messengerResolver = messengerResolver;
+ cancellationTokenSource = new CancellationTokenSource();
+
+ }
+
+ public void Start(int port)
+ {
+ if (socket == null)
+ {
+ socket = BindAccept(port);
+ }
+ }
+
+ private async Task BindUdp(int port)
+ {
+ socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+ socketUdp.Bind(new IPEndPoint(IPAddress.Any, port));
+ socketUdp.WindowsUdpBug();
+ IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
+ byte[] buffer = new byte[1024];
+ byte[] sendData = new byte[20];
+ while (true)
+ {
+ try
+ {
+ SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false);
+ IPEndPoint ep = result.RemoteEndPoint as IPEndPoint;
+ try
+ {
+ Memory memory = messengerResolver.BuildSendData(sendData, ep);
+
+ await socketUdp.SendToAsync(memory, ep).ConfigureAwait(false);
+ }
+ catch (Exception)
+ {
+ }
+ }
+ catch (Exception)
+ {
+ break;
+ }
+ }
+ }
+
+ private Socket BindAccept(int port)
+ {
+ IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
+ Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+ socket.IPv6Only(localEndPoint.AddressFamily, false);
+ socket.ReuseBind(localEndPoint);
+ socket.Listen(int.MaxValue);
+
+ SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs
+ {
+ UserToken = socket,
+ SocketFlags = SocketFlags.None,
+ };
+ acceptEventArg.Completed += IO_Completed;
+ StartAccept(acceptEventArg);
+
+ _ = BindUdp(port);
+ return socket;
+ }
+ private void StartAccept(SocketAsyncEventArgs acceptEventArg)
+ {
+ acceptEventArg.AcceptSocket = null;
+ Socket token = (Socket)acceptEventArg.UserToken;
+ try
+ {
+ if (token.AcceptAsync(acceptEventArg) == false)
+ {
+ ProcessAccept(acceptEventArg);
+ }
+ }
+ catch (Exception)
+ {
+ token?.SafeClose();
+ }
+ }
+ private void IO_Completed(object sender, SocketAsyncEventArgs e)
+ {
+ switch (e.LastOperation)
+ {
+ case SocketAsyncOperation.Accept:
+ ProcessAccept(e);
+ break;
+ default:
+ break;
+ }
+ }
+ private void ProcessAccept(SocketAsyncEventArgs e)
+ {
+ if (e.AcceptSocket != null)
+ {
+ _ = messengerResolver.BeginReceiveServer(e.AcceptSocket);
+ StartAccept(e);
+ }
+ }
+
+ public void Stop()
+ {
+ cancellationTokenSource?.Cancel();
+ socket?.SafeClose();
+ socket = null;
+ }
+ public void Disponse()
+ {
+ Stop();
+ }
+ }
+}
diff --git a/linker/server/config/Config.cs b/linker/plugins/server/config/Config.cs
similarity index 100%
rename from linker/server/config/Config.cs
rename to linker/plugins/server/config/Config.cs
diff --git a/linker/plugins/sforward/SForwardApiController.cs b/linker/plugins/sforward/SForwardApiController.cs
index 7d48b7e4..9f75766f 100644
--- a/linker/plugins/sforward/SForwardApiController.cs
+++ b/linker/plugins/sforward/SForwardApiController.cs
@@ -1,11 +1,11 @@
using linker.libs.api;
using linker.libs.extends;
-using linker.client.capi;
using linker.client.config;
-using linker.client;
-using linker.server;
using MemoryPack;
using linker.plugins.sforward.messenger;
+using linker.plugins.client;
+using linker.plugins.capi;
+using linker.plugins.messenger;
namespace linker.plugins.sforward
{
diff --git a/linker/plugins/sforward/SForwardStartup.cs b/linker/plugins/sforward/SForwardStartup.cs
index cf5016e0..51902cd3 100644
--- a/linker/plugins/sforward/SForwardStartup.cs
+++ b/linker/plugins/sforward/SForwardStartup.cs
@@ -18,7 +18,7 @@ namespace linker.plugins.sforward
public StartupLevel Level => StartupLevel.Normal;
- public string[] Dependent => Array.Empty();
+ public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
diff --git a/linker/plugins/sforward/SForwardTransfer.cs b/linker/plugins/sforward/SForwardTransfer.cs
index 40bf83ca..5b2a9974 100644
--- a/linker/plugins/sforward/SForwardTransfer.cs
+++ b/linker/plugins/sforward/SForwardTransfer.cs
@@ -1,13 +1,13 @@
using linker.client.config;
-using linker.client;
using linker.libs;
-using linker.server;
using linker.plugins.sforward.messenger;
using MemoryPack;
using linker.plugins.sforward.config;
using System.Net.Sockets;
using System.Net;
using linker.libs.extends;
+using linker.plugins.client;
+using linker.plugins.messenger;
namespace linker.plugins.sforward
{
diff --git a/linker/plugins/sforward/messenger/SForwardMessenger.cs b/linker/plugins/sforward/messenger/SForwardMessenger.cs
index fba9040a..1b6234db 100644
--- a/linker/plugins/sforward/messenger/SForwardMessenger.cs
+++ b/linker/plugins/sforward/messenger/SForwardMessenger.cs
@@ -2,13 +2,13 @@
using linker.plugins.sforward.config;
using linker.plugins.sforward.validator;
using linker.plugins.signin.messenger;
-using linker.server;
using MemoryPack;
using linker.plugins.sforward.proxy;
using linker.config;
using LiteDB;
using System.Net;
using linker.plugins.forward.messenger;
+using linker.plugins.messenger;
namespace linker.plugins.sforward.messenger
{
diff --git a/linker/plugins/sforward/validator/IValidator.cs b/linker/plugins/sforward/validator/IValidator.cs
index a13ee9c9..b8272c1c 100644
--- a/linker/plugins/sforward/validator/IValidator.cs
+++ b/linker/plugins/sforward/validator/IValidator.cs
@@ -1,5 +1,5 @@
-using linker.plugins.sforward.config;
-using linker.server;
+using linker.plugins.messenger;
+using linker.plugins.sforward.config;
namespace linker.plugins.sforward.validator
{
diff --git a/linker/plugins/sforward/validator/Validator.cs b/linker/plugins/sforward/validator/Validator.cs
index 3bd7af7f..f04adf8c 100644
--- a/linker/plugins/sforward/validator/Validator.cs
+++ b/linker/plugins/sforward/validator/Validator.cs
@@ -1,6 +1,6 @@
using linker.config;
+using linker.plugins.messenger;
using linker.plugins.sforward.config;
-using linker.server;
namespace linker.plugins.sforward.validator
{
diff --git a/linker/plugins/signIn/SignInApiController.cs b/linker/plugins/signIn/SignInApiController.cs
index be2ebbd6..eaca1908 100644
--- a/linker/plugins/signIn/SignInApiController.cs
+++ b/linker/plugins/signIn/SignInApiController.cs
@@ -2,10 +2,10 @@
using linker.plugins.signin.messenger;
using linker.libs.api;
using linker.libs.extends;
-using linker.client;
-using linker.server;
using MemoryPack;
-using linker.client.capi;
+using linker.plugins.client;
+using linker.plugins.capi;
+using linker.plugins.messenger;
namespace linker.plugins.signin
{
diff --git a/linker/plugins/signIn/SignInStartup.cs b/linker/plugins/signIn/SignInStartup.cs
index e40fd9c7..877a4599 100644
--- a/linker/plugins/signIn/SignInStartup.cs
+++ b/linker/plugins/signIn/SignInStartup.cs
@@ -13,7 +13,7 @@ namespace linker.plugins.signin
public bool Required => false;
- public string[] Dependent => new string[] { };
+ public string[] Dependent => new string[] { "messenger", };
public StartupLoadType LoadType => StartupLoadType.Normal;
diff --git a/linker/plugins/signIn/messenger/SignCaching.cs b/linker/plugins/signIn/messenger/SignCaching.cs
index 3043ca1c..a2ea27dc 100644
--- a/linker/plugins/signIn/messenger/SignCaching.cs
+++ b/linker/plugins/signIn/messenger/SignCaching.cs
@@ -1,11 +1,11 @@
using linker.store;
-using linker.server;
using linker.libs;
using LiteDB;
using MemoryPack;
using System.Collections.Concurrent;
using System.Net;
using System.Text.Json.Serialization;
+using linker.plugins.messenger;
namespace linker.plugins.signin.messenger
{
diff --git a/linker/plugins/signIn/messenger/SignInMessenger.cs b/linker/plugins/signIn/messenger/SignInMessenger.cs
index 6bcbd187..d7c25cd0 100644
--- a/linker/plugins/signIn/messenger/SignInMessenger.cs
+++ b/linker/plugins/signIn/messenger/SignInMessenger.cs
@@ -1,8 +1,8 @@
-using linker.client;
-using linker.config;
-using linker.server;
-using linker.libs;
+using linker.config;
using MemoryPack;
+using linker.plugins.client;
+using linker.plugins.server;
+using linker.plugins.messenger;
namespace linker.plugins.signin.messenger
{
diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs
index 8d55a197..3784f1ae 100644
--- a/linker/plugins/tunnel/TunnelAdapter.cs
+++ b/linker/plugins/tunnel/TunnelAdapter.cs
@@ -1,8 +1,6 @@
-using linker.client;
-using linker.client.config;
+using linker.client.config;
using linker.config;
using linker.plugins.tunnel.messenger;
-using linker.server;
using linker.tunnel.adapter;
using linker.tunnel.transport;
using linker.libs;
@@ -11,6 +9,8 @@ using System.Net;
using System.Security.Cryptography.X509Certificates;
using linker.tunnel.wanport;
using System.Buffers.Binary;
+using linker.plugins.client;
+using linker.plugins.messenger;
namespace linker.plugins.tunnel
{
diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker/plugins/tunnel/TunnelApiController.cs
index baad11b7..1f13792c 100644
--- a/linker/plugins/tunnel/TunnelApiController.cs
+++ b/linker/plugins/tunnel/TunnelApiController.cs
@@ -1,8 +1,5 @@
-using linker.client;
-using linker.client.capi;
-using linker.config;
+using linker.config;
using linker.plugins.tunnel.messenger;
-using linker.server;
using linker.tunnel.adapter;
using linker.tunnel.transport;
using linker.libs.api;
@@ -11,6 +8,10 @@ using MemoryPack;
using System.Collections.Concurrent;
using linker.tunnel.wanport;
using linker.client.config;
+using linker.plugins.client;
+using linker.plugins.server;
+using linker.plugins.capi;
+using linker.plugins.messenger;
namespace linker.plugins.tunnel
{
diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs
index 1cd79726..6aaaa7e4 100644
--- a/linker/plugins/tunnel/TunnelConfigTransfer.cs
+++ b/linker/plugins/tunnel/TunnelConfigTransfer.cs
@@ -1,12 +1,14 @@
-using linker.client;
-using linker.client.config;
+using linker.client.config;
using linker.config;
+using linker.libs;
+using linker.plugins.client;
+using linker.plugins.messenger;
using linker.plugins.tunnel.messenger;
-using linker.server;
using linker.tunnel.adapter;
using linker.tunnel.wanport;
using MemoryPack;
using System.Collections.Concurrent;
+using System.Net.Quic;
namespace linker.plugins.tunnel
{
@@ -35,20 +37,14 @@ namespace linker.plugins.tunnel
this.runningConfigTransfer = runningConfigTransfer;
this.tunnelAdapter = tunnelAdapter;
- clientSignInState.NetworkEnabledHandle += (times) =>
- {
- GetRemoveRouteLevel();
- };
- clientSignInState.NetworkFirstEnabledHandle += () =>
- {
- SyncExcludeIP();
- };
+
+ InitRouteLevel();
+ InitExcludeIP();
InitConfig();
- runningConfigTransfer.Setter(exipConfigKey, SettExcludeIPs);
- runningConfigTransfer.Getter(exipConfigKey, () => MemoryPackSerializer.Serialize(GetExcludeIPs()));
-
+ TestQuic();
}
+
private void InitConfig()
{
bool updateVersion = false;
@@ -85,7 +81,7 @@ namespace linker.plugins.tunnel
///
public void RefreshConfig()
{
- GetRemoveRouteLevel();
+ GetRemoteRouteLevel();
}
///
/// 修改自己的网关层级信息
@@ -95,7 +91,7 @@ namespace linker.plugins.tunnel
{
running.Data.Tunnel.RouteLevelPlus = tunnelTransportFileConfigInfo.RouteLevelPlus;
running.Data.Update();
- GetRemoveRouteLevel();
+ GetRemoteRouteLevel();
}
///
/// 收到别人发给我的修改我的信息
@@ -108,7 +104,7 @@ namespace linker.plugins.tunnel
Interlocked.Increment(ref version);
return GetLocalRouteLevel();
}
- private void GetRemoveRouteLevel()
+ private void GetRemoteRouteLevel()
{
TunnelTransportRouteLevelInfo config = GetLocalRouteLevel();
messengerSender.SendReply(new MessageRequestWrap
@@ -138,11 +134,28 @@ namespace linker.plugins.tunnel
{
MachineId = config.Data.Client.Id,
RouteLevel = config.Data.Client.Tunnel.RouteLevel,
- RouteLevelPlus = running.Data.Tunnel.RouteLevelPlus
+ RouteLevelPlus = running.Data.Tunnel.RouteLevelPlus,
+ NeedReboot = reboot
+ };
+ }
+ private void InitRouteLevel()
+ {
+ clientSignInState.NetworkEnabledHandle += (times) =>
+ {
+ GetRemoteRouteLevel();
};
}
+ private void InitExcludeIP()
+ {
+ clientSignInState.NetworkFirstEnabledHandle += () =>
+ {
+ SyncExcludeIP();
+ };
+ runningConfigTransfer.Setter(exipConfigKey, SettExcludeIPs);
+ runningConfigTransfer.Getter(exipConfigKey, () => MemoryPackSerializer.Serialize(GetExcludeIPs()));
+ }
private void SyncExcludeIP()
{
runningConfigTransfer.Sync(exipConfigKey, MemoryPackSerializer.Serialize(running.Data.Tunnel.ExcludeIPs));
@@ -163,5 +176,36 @@ namespace linker.plugins.tunnel
running.Data.Tunnel.ExcludeIPs = MemoryPackSerializer.Deserialize(data.Span);
running.Data.Update();
}
+
+
+ bool reboot = false;
+ private void TestQuic()
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ if (QuicListener.IsSupported == false)
+ {
+ try
+ {
+ if (File.Exists("msquic-openssl.dll"))
+ {
+ LoggerHelper.Instance.Warning($"copy msquic-openssl.dll -> msquic.dll,please restart linker");
+ File.Move("msquic.dll", "msquic.dll.temp", true);
+ File.Move("msquic-openssl.dll", "msquic.dll", true);
+
+ reboot = true;
+ }
+ }
+ catch (Exception)
+ {
+ }
+ }
+
+ if (File.Exists("msquic.dll.temp"))
+ {
+ File.Delete("msquic.dll.temp");
+ }
+ }
+ }
}
}
diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs
index da18b148..70bc6ed9 100644
--- a/linker/plugins/tunnel/TunnelStartup.cs
+++ b/linker/plugins/tunnel/TunnelStartup.cs
@@ -23,7 +23,7 @@ namespace linker.plugins.tunnel
public bool Required => false;
- public string[] Dependent => new string[] { };
+ public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
diff --git a/linker/plugins/tunnel/config/Config.cs b/linker/plugins/tunnel/config/Config.cs
index 7ebc460c..cd273aa5 100644
--- a/linker/plugins/tunnel/config/Config.cs
+++ b/linker/plugins/tunnel/config/Config.cs
@@ -72,6 +72,8 @@ namespace linker.config
public string MachineId { get; set; }
public int RouteLevel { get; set; } = 0;
public int RouteLevelPlus { get; set; } = 0;
+
+ public bool NeedReboot { get; set; }
}
diff --git a/linker/plugins/tunnel/messenger/TunnelMessenger.cs b/linker/plugins/tunnel/messenger/TunnelMessenger.cs
index e7e29fe3..aa863b4b 100644
--- a/linker/plugins/tunnel/messenger/TunnelMessenger.cs
+++ b/linker/plugins/tunnel/messenger/TunnelMessenger.cs
@@ -1,11 +1,11 @@
using linker.config;
using linker.plugins.signin.messenger;
-using linker.server;
using linker.tunnel;
using linker.tunnel.adapter;
using linker.tunnel.transport;
using linker.libs;
using MemoryPack;
+using linker.plugins.messenger;
namespace linker.plugins.tunnel.messenger
{
diff --git a/linker/plugins/tuntap/TuntapApiController.cs b/linker/plugins/tuntap/TuntapApiController.cs
index 9bfc5ae3..dce98f24 100644
--- a/linker/plugins/tuntap/TuntapApiController.cs
+++ b/linker/plugins/tuntap/TuntapApiController.cs
@@ -1,16 +1,16 @@
-using linker.server;
-using linker.libs.api;
+using linker.libs.api;
using linker.plugins.tuntap.vea;
-using linker.client;
using linker.plugins.tuntap.messenger;
using MemoryPack;
using linker.libs.extends;
-using linker.client.capi;
using System.Collections.Concurrent;
using linker.config;
-using linker.plugins.forward.proxy;
using linker.tunnel.connection;
using linker.plugins.tuntap.proxy;
+using linker.plugins.client;
+using linker.plugins.server;
+using linker.plugins.capi;
+using linker.plugins.messenger;
namespace linker.plugins.tuntap
{
diff --git a/linker/plugins/tuntap/TuntapStartup.cs b/linker/plugins/tuntap/TuntapStartup.cs
index fc85379b..beb0e50c 100644
--- a/linker/plugins/tuntap/TuntapStartup.cs
+++ b/linker/plugins/tuntap/TuntapStartup.cs
@@ -16,7 +16,7 @@ namespace linker.plugins.tuntap
public StartupLevel Level => StartupLevel.Normal;
public string Name => "tuntap";
public bool Required => false;
- public string[] Dependent => new string[] { "relay", "tunnel" };
+ public string[] Dependent => new string[] {"messenger", "relay", "tunnel", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
diff --git a/linker/plugins/tuntap/TuntapTransfer.cs b/linker/plugins/tuntap/TuntapTransfer.cs
index 261aee98..935de274 100644
--- a/linker/plugins/tuntap/TuntapTransfer.cs
+++ b/linker/plugins/tuntap/TuntapTransfer.cs
@@ -1,10 +1,8 @@
-using linker.client;
-using linker.client.config;
+using linker.client.config;
using linker.config;
using linker.plugins.tuntap.messenger;
using linker.plugins.tuntap.proxy;
using linker.plugins.tuntap.vea;
-using linker.server;
using linker.libs;
using MemoryPack;
using System.Buffers.Binary;
@@ -13,6 +11,8 @@ using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using linker.libs.extends;
+using linker.plugins.client;
+using linker.plugins.messenger;
namespace linker.plugins.tuntap
{
diff --git a/linker/plugins/tuntap/messenger/TuntapMessenger.cs b/linker/plugins/tuntap/messenger/TuntapMessenger.cs
index d2a104b2..944bda48 100644
--- a/linker/plugins/tuntap/messenger/TuntapMessenger.cs
+++ b/linker/plugins/tuntap/messenger/TuntapMessenger.cs
@@ -1,6 +1,6 @@
-using linker.plugins.signin.messenger;
+using linker.plugins.messenger;
+using linker.plugins.signin.messenger;
using linker.plugins.tuntap.vea;
-using linker.server;
using MemoryPack;
namespace linker.plugins.tuntap.messenger
diff --git a/linker/plugins/updater/UpdaterClientApiController.cs b/linker/plugins/updater/UpdaterClientApiController.cs
index 5322fbb1..d9c02445 100644
--- a/linker/plugins/updater/UpdaterClientApiController.cs
+++ b/linker/plugins/updater/UpdaterClientApiController.cs
@@ -1,7 +1,4 @@
-using linker.server;
-using linker.libs.api;
-using linker.client;
-using linker.client.capi;
+using linker.libs.api;
using linker.config;
using linker.plugins.updater.messenger;
using MemoryPack;
@@ -9,6 +6,9 @@ using System.Collections.Concurrent;
using linker.plugins.updater.config;
using linker.libs.extends;
using linker.client.config;
+using linker.plugins.client;
+using linker.plugins.capi;
+using linker.plugins.messenger;
namespace linker.plugins.updater
{
diff --git a/linker/plugins/updater/UpdaterClientTransfer.cs b/linker/plugins/updater/UpdaterClientTransfer.cs
index 2273d3f1..cd7e86ac 100644
--- a/linker/plugins/updater/UpdaterClientTransfer.cs
+++ b/linker/plugins/updater/UpdaterClientTransfer.cs
@@ -1,8 +1,9 @@
-using linker.client;
-using linker.client.config;
+using linker.client.config;
using linker.config;
+using linker.plugins.client;
+using linker.plugins.messenger;
+using linker.plugins.server;
using linker.plugins.updater.messenger;
-using linker.server;
using MemoryPack;
using System.Collections.Concurrent;
@@ -78,7 +79,6 @@ namespace linker.plugins.updater
{
updaterHelper.Confirm(updateInfo, version);
}
-
///
/// 来自别的客户端的更新信息
///
diff --git a/linker/plugins/updater/UpdaterHelper.cs b/linker/plugins/updater/UpdaterHelper.cs
index 00a10588..fed9f8b3 100644
--- a/linker/plugins/updater/UpdaterHelper.cs
+++ b/linker/plugins/updater/UpdaterHelper.cs
@@ -36,10 +36,11 @@ namespace linker.plugins.updater
using HttpClient httpClient = new HttpClient();
string str = await httpClient.GetStringAsync("http://gh.snltty.com:1808/https://github.com/snltty/linker/releases/latest").WaitAsync(TimeSpan.FromSeconds(15));
- Match match = new Regex(@"/snltty/linker/tree/(v[\d.]+)").Match(str);
- string tag = match.Groups[1].Value;
+ string datetime = DateTime.Parse(new Regex("datetime=\"(.+)\"").Match(str).Groups[1].Value).ToString("yyyy-MM-dd HH:mm:ss");
+ string tag = new Regex(@"/snltty/linker/tree/(v[\d.]+)").Match(str).Groups[1].Value;
string[] msg = new Regex(@"(.+)").Matches(str).Select(c => c.Groups[1].Value).ToArray();
+ updateInfo.DateTime = datetime;
updateInfo.Msg = msg;
updateInfo.Version = tag;
@@ -243,6 +244,8 @@ namespace linker.plugins.updater
public string Version { get; set; }
[MemoryPackIgnore]
public string[] Msg { get; set; }
+ [MemoryPackIgnore]
+ public string DateTime { get; set; }
public string MachineId { get; set; }
public UpdateStatus Status { get; set; } = UpdateStatus.None;
diff --git a/linker/plugins/updater/UpdaterStartup.cs b/linker/plugins/updater/UpdaterStartup.cs
index 19cb78fe..597691f3 100644
--- a/linker/plugins/updater/UpdaterStartup.cs
+++ b/linker/plugins/updater/UpdaterStartup.cs
@@ -17,7 +17,7 @@ namespace linker.plugins.updater
public StartupLevel Level => StartupLevel.Normal;
- public string[] Dependent => Array.Empty();
+ public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
diff --git a/linker/plugins/updater/messenger/UpdaterMessenger.cs b/linker/plugins/updater/messenger/UpdaterMessenger.cs
index d4c53375..4e95571d 100644
--- a/linker/plugins/updater/messenger/UpdaterMessenger.cs
+++ b/linker/plugins/updater/messenger/UpdaterMessenger.cs
@@ -1,7 +1,8 @@
using linker.config;
+using linker.plugins.messenger;
+using linker.plugins.server;
using linker.plugins.signin.messenger;
using linker.plugins.updater.config;
-using linker.server;
using MemoryPack;
namespace linker.plugins.updater.messenger
diff --git a/linker/server/TcpServer.cs b/linker/server/TcpServer.cs
deleted file mode 100644
index 0cd44074..00000000
--- a/linker/server/TcpServer.cs
+++ /dev/null
@@ -1,258 +0,0 @@
-using linker.libs;
-using linker.libs.extends;
-using System.Buffers;
-using System.Net;
-using System.Net.Security;
-using System.Net.Sockets;
-using System.Security.Authentication;
-using System.Security.Cryptography.X509Certificates;
-
-namespace linker.server
-{
- public sealed class TcpServer
- {
- private Socket socket;
- private Socket socketUdp;
- private CancellationTokenSource cancellationTokenSource;
- private X509Certificate serverCertificate;
-
- private readonly IConnectionReceiveCallback connectionReceiveCallback;
- public TcpServer(MessengerResolver connectionReceiveCallback)
- {
- cancellationTokenSource = new CancellationTokenSource();
- this.connectionReceiveCallback = connectionReceiveCallback;
- }
-
- public void Init(string certificate, string password)
- {
- string path = Path.GetFullPath(certificate);
- if (File.Exists(path))
- {
- serverCertificate = new X509Certificate(path, password);
- }
- else
- {
- LoggerHelper.Instance.Error($"file {path} not found");
- Environment.Exit(0);
- }
- }
-
- public void Start(int port)
- {
- if (socket == null)
- {
- socket = BindAccept(port);
- }
- }
- private Socket BindAccept(int port)
- {
- IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
- Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
- socket.IPv6Only(localEndPoint.AddressFamily, false);
- socket.ReuseBind(localEndPoint);
- socket.Listen(int.MaxValue);
-
- SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs
- {
- UserToken = socket,
- SocketFlags = SocketFlags.None,
- };
- acceptEventArg.Completed += IO_Completed;
- StartAccept(acceptEventArg);
-
- _ = BindUdp(port);
- return socket;
- }
-
-
- private Memory BuildSendData(byte[] data, IPEndPoint ep)
- {
- //给客户端返回他的IP+端口
- data[0] = (byte)ep.AddressFamily;
- ep.Address.TryWriteBytes(data.AsSpan(1), out int length);
- ((ushort)ep.Port).ToBytes(data.AsMemory(1 + length));
-
- //防止一些网关修改掉它的外网IP
- for (int i = 0; i < 1 + length + 2; i++)
- {
- data[i] = (byte)(data[i] ^ byte.MaxValue);
- }
- return data.AsMemory(0, 1 + length + 2);
- }
-
- private async Task BindUdp(int port)
- {
- socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- socketUdp.Bind(new IPEndPoint(IPAddress.Any, port));
- socketUdp.WindowsUdpBug();
- IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
- byte[] buffer = new byte[1024];
- byte[] sendData = new byte[20];
- while (true)
- {
- try
- {
- SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false);
- IPEndPoint ep = result.RemoteEndPoint as IPEndPoint;
- try
- {
- Memory memory = BuildSendData(sendData, ep);
-
- await socketUdp.SendToAsync(memory, ep).ConfigureAwait(false);
- }
- catch (Exception)
- {
- }
- }
- catch (Exception)
- {
- break;
- }
- }
- }
-
- private void StartAccept(SocketAsyncEventArgs acceptEventArg)
- {
- acceptEventArg.AcceptSocket = null;
- Socket token = (Socket)acceptEventArg.UserToken;
- try
- {
- if (token.AcceptAsync(acceptEventArg) == false)
- {
- ProcessAccept(acceptEventArg);
- }
- }
- catch (Exception)
- {
- token?.SafeClose();
- }
- }
- private void IO_Completed(object sender, SocketAsyncEventArgs e)
- {
- switch (e.LastOperation)
- {
- case SocketAsyncOperation.Accept:
- ProcessAccept(e);
- break;
- default:
- break;
- }
- }
- private void ProcessAccept(SocketAsyncEventArgs e)
- {
- if (e.AcceptSocket != null)
- {
- _ = BeginReceiveServer(e.AcceptSocket);
- StartAccept(e);
- }
- }
-
- private async Task ReceiveType(Socket socket)
- {
- byte[] sendData = ArrayPool.Shared.Rent(20);
- try
- {
- await socket.ReceiveAsync(sendData.AsMemory(0, 1), SocketFlags.None).ConfigureAwait(false);
- byte type = sendData[0];
- if (type == 0)
- {
- Memory memory = BuildSendData(sendData, socket.RemoteEndPoint as IPEndPoint);
- await socket.SendAsync(memory, SocketFlags.None).ConfigureAwait(false);
- }
- return type;
- }
- catch (Exception)
- {
- }
- finally
- {
- ArrayPool.Shared.Return(sendData);
- }
- return 1;
- }
- private async Task BeginReceiveServer(Socket socket)
- {
- try
- {
- if (socket == null || socket.RemoteEndPoint == null)
- {
- return;
- }
- socket.KeepAlive();
-
- if (await ReceiveType(socket).ConfigureAwait(false) == 0)
- {
- return;
- }
-
- NetworkStream networkStream = new NetworkStream(socket, false);
- SslStream sslStream = new SslStream(networkStream, true);
- await sslStream.AuthenticateAsServerAsync(serverCertificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
- IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint);
-
-
- connection.BeginReceive(connectionReceiveCallback, null, true);
- }
- catch (Exception ex)
- {
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- LoggerHelper.Instance.Error(ex);
- }
- }
-
- private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
- {
- return true;
- }
- public async Task BeginReceive(Socket socket)
- {
- try
- {
- if (socket == null || socket.RemoteEndPoint == null)
- {
- return null;
- }
- socket.KeepAlive();
- await socket.SendAsync(new byte[] { 1 }).ConfigureAwait(false);
- NetworkStream networkStream = new NetworkStream(socket, false);
- SslStream sslStream = new SslStream(networkStream, true, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
- await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions
- {
- AllowRenegotiation = true,
- EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13
- }).ConfigureAwait(false);
- IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint);
-
- connection.BeginReceive(connectionReceiveCallback, null, true);
-
- return connection;
- }
- catch (Exception ex)
- {
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- LoggerHelper.Instance.Error(ex);
- }
- return null;
- }
-
- public IConnection CreateConnection(SslStream stream, NetworkStream networkStream, Socket socket, IPEndPoint local, IPEndPoint remote)
- {
- return new TcpConnection(stream, networkStream, socket, local, remote)
- {
- ReceiveRequestWrap = new MessageRequestWrap(),
- ReceiveResponseWrap = new MessageResponseWrap()
- };
- }
-
- public void Stop()
- {
- cancellationTokenSource?.Cancel();
- socket?.SafeClose();
- socket = null;
- }
- public void Disponse()
- {
- Stop();
- }
- }
-}