udp中继

This commit is contained in:
snltty
2025-03-16 18:51:32 +08:00
parent 488c0381d9
commit 06ef41f242
103 changed files with 899 additions and 711 deletions

View File

@@ -51,7 +51,12 @@ sidebar_position: 2
//主服务器地址 //主服务器地址
"MasterHost": "linker.snltty.com:1802", "MasterHost": "linker.snltty.com:1802",
//主服务器的密钥主服务里的Master里的SecretKey //主服务器的密钥主服务里的Master里的SecretKey
"MasterSecretKey": "" "MasterSecretKey": "",
//随便什么url在客户端看节点列表的时候可以点击跳转
"Url": "",
//是否允许TCPUDP
"AllowTcp":true,
"AllowUdp":false,
}, },
//我是主服务器,接收其它中继节点服务器的信息 //我是主服务器,接收其它中继节点服务器的信息
"Master": { "Master": {

View File

@@ -20,9 +20,13 @@ namespace linker.libs
public interface ICrypto public interface ICrypto
{ {
public byte[] Encode(byte[] buffer); public byte[] Encode(byte[] buffer);
public byte[] Encode(byte[] buffer, int offset, int length); public byte[] Encode(byte[] buffer, int offset, int lengtht);
public int Encode(byte[] buffer, byte[] outputBuffer, int outputOffset);
public int Encode(byte[] buffer, int offset, int length, byte[] outputBuffer, int outputOffset);
public Memory<byte> Decode(byte[] buffer); public Memory<byte> Decode(byte[] buffer);
public Memory<byte> Decode(byte[] buffer, int offset, int length); public Memory<byte> Decode(byte[] buffer, int offset, int length);
public int Decode(byte[] buffer, byte[] outputBuffer, int outputOffset);
public int Decode(byte[] buffer, int offset, int length, byte[] outputBuffer, int outputOffset);
public void Dispose(); public void Dispose();
} }
@@ -56,6 +60,26 @@ namespace linker.libs
{ {
return encryptoTransform.TransformFinalBlock(buffer, offset, length); return encryptoTransform.TransformFinalBlock(buffer, offset, length);
} }
public int Encode(byte[] buffer, byte[] outputBuffer, int outputOffset)
{
return Encode(buffer, 0, buffer.Length, outputBuffer, outputOffset);
}
public int Encode(byte[] buffer, int offset, int length, byte[] outputBuffer, int outputOffset)
{
int blockSize = encryptoTransform.InputBlockSize;
int blocks = length / blockSize;
int remainingBytes = length % blockSize;
int written = encryptoTransform.TransformBlock(buffer, offset, blockSize * blocks, outputBuffer, outputOffset);
if (remainingBytes > 0)
{
byte[] finalBlock = encryptoTransform.TransformFinalBlock(buffer, offset + blocks * blockSize, remainingBytes);
finalBlock.CopyTo(outputBuffer, outputOffset + written);
written += finalBlock.Length;
}
return written;
}
public Memory<byte> Decode(byte[] buffer) public Memory<byte> Decode(byte[] buffer)
{ {
return Decode(buffer, 0, buffer.Length); return Decode(buffer, 0, buffer.Length);
@@ -64,12 +88,32 @@ namespace linker.libs
{ {
return decryptoTransform.TransformFinalBlock(buffer, offset, length); return decryptoTransform.TransformFinalBlock(buffer, offset, length);
} }
public int Decode(byte[] buffer, byte[] outputBuffer, int outputOffset)
{
return Decode(buffer, 0, buffer.Length, outputBuffer, outputOffset);
}
public int Decode(byte[] buffer, int offset, int length, byte[] outputBuffer, int outputOffset)
{
int blockSize = decryptoTransform.InputBlockSize;
int blocks = length / blockSize;
int remainingBytes = length % blockSize;
int written = decryptoTransform.TransformBlock(buffer, offset, blockSize * blocks, outputBuffer, outputOffset);
if (remainingBytes > 0)
{
byte[] finalBlock = decryptoTransform.TransformFinalBlock(buffer, offset + blocks * blockSize, remainingBytes);
finalBlock.CopyTo(outputBuffer, outputOffset + written);
written += finalBlock.Length;
}
return written;
}
public void Dispose() public void Dispose()
{ {
encryptoTransform.Dispose(); encryptoTransform.Dispose();
decryptoTransform.Dispose(); decryptoTransform.Dispose();
} }
private (byte[] Key, byte[] IV) GenerateKeyAndIV(string password) private (byte[] Key, byte[] IV) GenerateKeyAndIV(string password)
{ {
byte[] key = new byte[16]; byte[] key = new byte[16];

View File

@@ -88,7 +88,7 @@ namespace linker.libs
{ {
return ip; return ip;
} }
return (await Dns.GetHostEntryAsync(domain, AddressFamily.InterNetwork)).AddressList.FirstOrDefault(); return (await Dns.GetHostEntryAsync(domain, AddressFamily.InterNetwork).ConfigureAwait(false)).AddressList.FirstOrDefault();
} }
catch (Exception) catch (Exception)
{ {
@@ -123,7 +123,7 @@ namespace linker.libs
{ {
port = int.Parse(hostArr[1]); port = int.Parse(hostArr[1]);
} }
IPAddress ip = await GetDomainIpAsync(hostArr[0]); IPAddress ip = await GetDomainIpAsync(hostArr[0]).ConfigureAwait(false);
return new IPEndPoint(ip, port); return new IPEndPoint(ip, port);
} }
catch (Exception) catch (Exception)
@@ -227,7 +227,12 @@ namespace linker.libs
return GetIP() return GetIP()
.Where(c => c.AddressFamily == AddressFamily.InterNetworkV6) .Where(c => c.AddressFamily == AddressFamily.InterNetworkV6)
.Where(c => c.GetAddressBytes().AsSpan(0, 8).SequenceEqual(ipv6LocalBytes) == false) .Where(c => c.GetAddressBytes().AsSpan(0, 8).SequenceEqual(ipv6LocalBytes) == false)
.Where(c=>c.Equals(IPAddress.IPv6Loopback) == false) .Where(c => c.Equals(IPAddress.IPv6Loopback) == false)
.Where(c =>
{
byte[] addressBytes = c.GetAddressBytes();
return (addressBytes[0] == 0xFD || (addressBytes[0] == 0xFE && (addressBytes[1] & 0xC0) == 0x80)) == false;
})
.Distinct().ToArray(); .Distinct().ToArray();
} }
public static IPAddress[] GetIPV4() public static IPAddress[] GetIPV4()

View File

@@ -9,86 +9,46 @@ namespace linker.libs
{ {
Task.Run(async () => Task.Run(async () =>
{ {
await Task.Delay(delayMs); await Task.Delay(delayMs).ConfigureAwait(false);
action(); action();
}); });
} }
public static void SetInterval(Func<bool> action, int delayMs)
{
Task.Run(async () =>
{
while (action())
{
await Task.Delay(delayMs).ConfigureAwait(false);
}
});
}
public static void SetIntervalLong(Func<bool> action, int delayMs) public static void SetIntervalLong(Func<bool> action, int delayMs)
{ {
Task.Factory.StartNew(async () => Task.Factory.StartNew(() =>
{ {
while (action()) while (action())
{ {
await Task.Delay(delayMs).ConfigureAwait(false); Task.Delay(delayMs).Wait();
} }
}, TaskCreationOptions.LongRunning); }, TaskCreationOptions.LongRunning);
} }
public static void SetInterval(Func<Task<bool>> action, int delayMs)
{
Task.Run(async () =>
{
while (await action())
{
await Task.Delay(delayMs).ConfigureAwait(false);
}
});
}
public static void SetIntervalLong(Func<Task<bool>> action, int delay) public static void SetIntervalLong(Func<Task<bool>> action, int delay)
{ {
Task.Factory.StartNew(async () => Task.Factory.StartNew(async () =>
{ {
while (await action()) while (await action().ConfigureAwait(false))
{ {
await Task.Delay(delay).ConfigureAwait(false); await Task.Delay(delay).ConfigureAwait(false);
} }
}, TaskCreationOptions.LongRunning); }, TaskCreationOptions.LongRunning);
} }
public static void SetInterval(Func<bool> action, Func<int> delay)
{
Task.Run(async () =>
{
while (action())
{
await Task.Delay(delay()).ConfigureAwait(false);
}
});
}
public static void SetIntervalLong(Func<bool> action, Func<int> delay) public static void SetIntervalLong(Func<bool> action, Func<int> delay)
{ {
Task.Factory.StartNew(async () => Task.Factory.StartNew(() =>
{ {
while (action()) while (action())
{ {
await Task.Delay(delay()).ConfigureAwait(false); Task.Delay(delay()).Wait();
} }
}, TaskCreationOptions.LongRunning); }, TaskCreationOptions.LongRunning);
} }
public static void SetInterval(Func<Task<bool>> action, Func<int> delay)
{
Task.Run(async () =>
{
while (await action())
{
await Task.Delay(delay()).ConfigureAwait(false);
}
});
}
public static void SetIntervalLong(Func<Task<bool>> action, Func<int> delay) public static void SetIntervalLong(Func<Task<bool>> action, Func<int> delay)
{ {
Task.Factory.StartNew(async () => Task.Factory.StartNew(async () =>
{ {
while (await action()) while (await action().ConfigureAwait(false))
{ {
await Task.Delay(delay()).ConfigureAwait(false); await Task.Delay(delay()).ConfigureAwait(false);
} }
@@ -103,10 +63,7 @@ namespace linker.libs
{ {
Task.Run(action); Task.Run(action);
} }
public static void AsyncLong(Func<Task> action)
{
Task.Factory.StartNew(action,TaskCreationOptions.LongRunning);
}
} }
} }

View File

@@ -63,7 +63,7 @@ namespace linker.messenger.access
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)AccessMessengerIds.AccessUpdateForward, MessengerId = (ushort)AccessMessengerIds.AccessUpdateForward,
Payload = serializer.Serialize(configUpdateAccessInfo) Payload = serializer.Serialize(configUpdateAccessInfo)
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
@@ -84,7 +84,7 @@ namespace linker.messenger.access
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)AccessMessengerIds.SetApiPasswordForward, MessengerId = (ushort)AccessMessengerIds.SetApiPasswordForward,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }

View File

@@ -11,10 +11,10 @@ namespace linker.messenger.action
{ {
using HttpClient client = new HttpClient(); using HttpClient client = new HttpClient();
JsonContent json = JsonContent.Create(JsonObject.Parse(actionJson)); JsonContent json = JsonContent.Create(JsonObject.Parse(actionJson));
HttpResponseMessage resp = await client.PostAsync(url, json); HttpResponseMessage resp = await client.PostAsync(url, json).ConfigureAwait(false);
if (resp.IsSuccessStatusCode) if (resp.IsSuccessStatusCode)
{ {
string result = await resp.Content.ReadAsStringAsync(); string result = await resp.Content.ReadAsStringAsync().ConfigureAwait(false);
if (result.Equals("ok", StringComparison.CurrentCultureIgnoreCase) == false) if (result.Equals("ok", StringComparison.CurrentCultureIgnoreCase) == false)
{ {
return $"post {url} fail->{result}"; return $"post {url} fail->{result}";

View File

@@ -141,7 +141,7 @@ namespace linker.messenger.action
IPAddress = signInfo.Connection.Address.Address IPAddress = signInfo.Connection.Address.Address
} }
}; };
return await actionTransfer.ExcuteActions(Replace(replace, str), actionServerStore.SignInActionUrl); return await actionTransfer.ExcuteActions(Replace(replace, str), actionServerStore.SignInActionUrl).ConfigureAwait(false);
} }
return string.Empty; return string.Empty;
@@ -192,7 +192,7 @@ namespace linker.messenger.action
IPAddress = fromMachine.Connection.Address.Address, IPAddress = fromMachine.Connection.Address.Address,
} }
}; };
return await actionTransfer.ExcuteActions(Replace(replace, str), actionServerStore.RelayActionUrl); return await actionTransfer.ExcuteActions(Replace(replace, str), actionServerStore.RelayActionUrl).ConfigureAwait(false);
} }
return string.Empty; return string.Empty;
} }
@@ -234,7 +234,7 @@ namespace linker.messenger.action
IPAddress = cache.Connection.Address.Address IPAddress = cache.Connection.Address.Address
} }
}; };
return await actionTransfer.ExcuteActions(Replace(replace, str), actionServerStore.SForwardActionUrl); return await actionTransfer.ExcuteActions(Replace(replace, str), actionServerStore.SForwardActionUrl).ConfigureAwait(false);
} }
return string.Empty; return string.Empty;
} }

View File

@@ -85,7 +85,7 @@ namespace linker.messenger.channel
try try
{ {
//锁 //锁
if (await WaitAsync(machineId) == false) if (await WaitAsync(machineId).ConfigureAwait(false) == false)
{ {
return null; return null;
} }
@@ -96,12 +96,12 @@ namespace linker.messenger.channel
return connection; return connection;
} }
//不在线就不必连了 //不在线就不必连了
if (await signInClientTransfer.GetOnline(machineId) == false) if (await signInClientTransfer.GetOnline(machineId).ConfigureAwait(false) == false)
{ {
return null; return null;
} }
connection = await RelayAndP2P(machineId, denyProtocols); connection = await RelayAndP2P(machineId, denyProtocols).ConfigureAwait(false);
if (connection != null) if (connection != null)
{ {
@@ -123,7 +123,7 @@ namespace linker.messenger.channel
{ {
//中继 //中继
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay to {machineId}"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay to {machineId}");
ITunnelConnection connection = await relayTransfer.ConnectAsync(signInClientStore.Id, machineId, TransactionId, relayClientStore.DefaultNodeId).ConfigureAwait(false); ITunnelConnection connection = await relayTransfer.ConnectAsync(signInClientStore.Id, machineId, TransactionId, denyProtocols, relayClientStore.DefaultNodeId).ConfigureAwait(false);
if (connection != null) if (connection != null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay success,{connection.ToString()}"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay success,{connection.ToString()}");

View File

@@ -74,7 +74,7 @@ namespace linker.messenger.decenter
}).ToList(); }).ToList();
if (tasks.Count > 0) if (tasks.Count > 0)
{ {
await Task.WhenAll(tasks.Select(c => c.Task)); await Task.WhenAll(tasks.Select(c => c.Task)).ConfigureAwait(false);
foreach (var task in tasks) foreach (var task in tasks)
{ {
if (task.Task.Result.Code == MessageResponeCodes.OK) if (task.Task.Result.Code == MessageResponeCodes.OK)

View File

@@ -31,7 +31,7 @@ namespace linker.messenger.flow
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)FlowMessengerIds.List, MessengerId = (ushort)FlowMessengerIds.List,
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
return serializer.Deserialize<FlowInfo>(resp.Data.Span); return serializer.Deserialize<FlowInfo>(resp.Data.Span);
@@ -44,7 +44,7 @@ namespace linker.messenger.flow
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)FlowMessengerIds.Citys, MessengerId = (ushort)FlowMessengerIds.Citys,
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
return serializer.Deserialize<List<FlowReportNetInfo>>(resp.Data.Span); return serializer.Deserialize<List<FlowReportNetInfo>>(resp.Data.Span);
@@ -58,7 +58,7 @@ namespace linker.messenger.flow
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)FlowMessengerIds.Messenger, MessengerId = (ushort)FlowMessengerIds.Messenger,
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
return serializer.Deserialize<Dictionary<ushort, FlowItemInfo>>(resp.Data.Span); return serializer.Deserialize<Dictionary<ushort, FlowItemInfo>>(resp.Data.Span);
@@ -77,7 +77,7 @@ namespace linker.messenger.flow
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)FlowMessengerIds.SForward, MessengerId = (ushort)FlowMessengerIds.SForward,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
return serializer.Deserialize<SForwardFlowResponseInfo>(resp.Data.Span); return serializer.Deserialize<SForwardFlowResponseInfo>(resp.Data.Span);
@@ -96,7 +96,7 @@ namespace linker.messenger.flow
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)FlowMessengerIds.Relay, MessengerId = (ushort)FlowMessengerIds.Relay,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
return serializer.Deserialize<RelayFlowResponseInfo>(resp.Data.Span); return serializer.Deserialize<RelayFlowResponseInfo>(resp.Data.Span);

View File

@@ -37,7 +37,7 @@ namespace linker.messenger.flow
public async Task Resolve(Socket socket, Memory<byte> memory) public async Task Resolve(Socket socket, Memory<byte> memory)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory) public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory)
{ {
@@ -63,7 +63,7 @@ namespace linker.messenger.flow
{ {
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }

View File

@@ -95,7 +95,7 @@ namespace linker.messenger.forward
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.GetForward, MessengerId = (ushort)ForwardMessengerIds.GetForward,
Payload = serializer.Serialize(param.Content) Payload = serializer.Serialize(param.Content)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
return serializer.Deserialize<List<ForwardInfo>>(resp.Data.Span); return serializer.Deserialize<List<ForwardInfo>>(resp.Data.Span);
@@ -123,7 +123,7 @@ namespace linker.messenger.forward
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.AddForward, MessengerId = (ushort)ForwardMessengerIds.AddForward,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@@ -146,7 +146,7 @@ namespace linker.messenger.forward
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.RemoveForward, MessengerId = (ushort)ForwardMessengerIds.RemoveForward,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@@ -166,7 +166,7 @@ namespace linker.messenger.forward
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.SubTestForward, MessengerId = (ushort)ForwardMessengerIds.SubTestForward,
Payload = serializer.Serialize(param.Content) Payload = serializer.Serialize(param.Content)
}); }).ConfigureAwait(false);
return true; return true;
} }
} }

View File

@@ -63,7 +63,7 @@ namespace linker.messenger.forward
Connection = cacheTo.Connection, Connection = cacheTo.Connection,
MessengerId = (ushort)ForwardMessengerIds.Add, MessengerId = (ushort)ForwardMessengerIds.Add,
Payload = serializer.Serialize(info.Data) Payload = serializer.Serialize(info.Data)
}); }).ConfigureAwait(false);
} }
} }
/// <summary> /// <summary>
@@ -82,7 +82,7 @@ namespace linker.messenger.forward
Connection = cacheTo.Connection, Connection = cacheTo.Connection,
MessengerId = (ushort)ForwardMessengerIds.Remove, MessengerId = (ushort)ForwardMessengerIds.Remove,
Payload = serializer.Serialize(info.Id) Payload = serializer.Serialize(info.Id)
}); }).ConfigureAwait(false);
} }
} }
@@ -97,7 +97,7 @@ namespace linker.messenger.forward
{ {
Connection = cacheTo.Connection, Connection = cacheTo.Connection,
MessengerId = (ushort)ForwardMessengerIds.SubTest MessengerId = (ushort)ForwardMessengerIds.SubTest
}); }).ConfigureAwait(false);
} }
} }

View File

@@ -164,7 +164,7 @@ namespace linker.messenger.forward
return false; return false;
} }
await Task.WhenAll(list.Select(Connect)); await Task.WhenAll(list.Select(Connect)).ConfigureAwait(false);
testing.StopOperation(); testing.StopOperation();
return true; return true;
@@ -173,7 +173,7 @@ namespace linker.messenger.forward
Socket socket = new Socket(info.Target.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Socket socket = new Socket(info.Target.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try try
{ {
await socket.ConnectAsync(info.Target).WaitAsync(TimeSpan.FromMilliseconds(100)); await socket.ConnectAsync(info.Target).WaitAsync(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false);
info.Msg = string.Empty; info.Msg = string.Empty;
} }
catch (Exception ex) catch (Exception ex)

View File

@@ -79,7 +79,7 @@ namespace linker.messenger.forward.proxy
public async Task Closed(ITunnelConnection connection, object userToken) public async Task Closed(ITunnelConnection connection, object userToken)
{ {
Version.Add(); Version.Add();
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
/// <summary> /// <summary>

View File

@@ -65,7 +65,7 @@ namespace linker.messenger.pcp
{ {
//TunnelTagInfo tag = new TunnelTagInfo { FromMachineId = signInClientStore.Id, ToMachineId = remoteMachineId, TransactionId = transactionId, NodeId = string.Empty, NodeIds = pcpStore.PcpHistory.History }; //TunnelTagInfo tag = new TunnelTagInfo { FromMachineId = signInClientStore.Id, ToMachineId = remoteMachineId, TransactionId = transactionId, NodeId = string.Empty, NodeIds = pcpStore.PcpHistory.History };
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return null; return null;
} }

View File

@@ -7,6 +7,7 @@ using linker.messenger.relay.client.transport;
using linker.messenger.relay.messenger; using linker.messenger.relay.messenger;
using linker.messenger.relay.server; using linker.messenger.relay.server;
using linker.messenger.signin; using linker.messenger.signin;
using linker.tunnel.connection;
namespace linker.messenger.relay namespace linker.messenger.relay
{ {
@@ -52,7 +53,13 @@ namespace linker.messenger.relay
public bool Connect(ApiControllerParamsInfo param) public bool Connect(ApiControllerParamsInfo param)
{ {
RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>(); RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>();
_ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId); if(relayConnectInfo.Protocol == TunnelProtocolType.None)
{
relayConnectInfo.Protocol = TunnelProtocolType.Tcp;
}
relayConnectInfo.ToMachineId = "67d67cb942b4da0c16b5f5ec";
relayConnectInfo.TransactionId = "tuntap";
_ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId, relayConnectInfo.Protocol);
relayClientStore.SetDefaultNodeId(relayConnectInfo.NodeId); relayClientStore.SetDefaultNodeId(relayConnectInfo.NodeId);
return true; return true;
} }
@@ -65,7 +72,7 @@ namespace linker.messenger.relay
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.AccessCdkey, MessengerId = (ushort)RelayMessengerIds.AccessCdkey,
Payload = serializer.Serialize(relayClientStore.Server.SecretKey) Payload = serializer.Serialize(relayClientStore.Server.SecretKey)
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
@@ -82,7 +89,7 @@ namespace linker.messenger.relay
Data = info, Data = info,
SecretKey = relayClientStore.Server.SecretKey SecretKey = relayClientStore.Server.SecretKey
}) })
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
@@ -100,7 +107,7 @@ namespace linker.messenger.relay
UserId = signInClientStore.Server.UserId, UserId = signInClientStore.Server.UserId,
SecretKey = relayClientStore.Server.SecretKey SecretKey = relayClientStore.Server.SecretKey
}) })
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
@@ -115,7 +122,7 @@ namespace linker.messenger.relay
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.PageCdkey, MessengerId = (ushort)RelayMessengerIds.PageCdkey,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
return serializer.Deserialize<RelayServerCdkeyPageResultInfo>(resp.Data.Span); return serializer.Deserialize<RelayServerCdkeyPageResultInfo>(resp.Data.Span);
@@ -134,7 +141,7 @@ namespace linker.messenger.relay
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.PageCdkey, MessengerId = (ushort)RelayMessengerIds.PageCdkey,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
return serializer.Deserialize<RelayServerCdkeyPageResultInfo>(resp.Data.Span); return serializer.Deserialize<RelayServerCdkeyPageResultInfo>(resp.Data.Span);
@@ -153,7 +160,7 @@ namespace linker.messenger.relay
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.TestCdkey, MessengerId = (ushort)RelayMessengerIds.TestCdkey,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
return serializer.Deserialize<RelayServerCdkeyTestResultInfo>(resp.Data.Span); return serializer.Deserialize<RelayServerCdkeyTestResultInfo>(resp.Data.Span);
@@ -172,7 +179,7 @@ namespace linker.messenger.relay
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.ImportCdkey, MessengerId = (ushort)RelayMessengerIds.ImportCdkey,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
return serializer.Deserialize<string>(resp.Data.Span); return serializer.Deserialize<string>(resp.Data.Span);
@@ -191,7 +198,7 @@ namespace linker.messenger.relay
Info = info, Info = info,
SecretKey = relayClientStore.Server.SecretKey SecretKey = relayClientStore.Server.SecretKey
}) })
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
} }
@@ -202,6 +209,9 @@ namespace linker.messenger.relay
public string ToMachineId { get; set; } public string ToMachineId { get; set; }
public string TransactionId { get; set; } public string TransactionId { get; set; }
public string NodeId { get; set; } public string NodeId { get; set; }
public TunnelProtocolType Protocol { get; set; }
} }
} }

View File

@@ -48,7 +48,7 @@ namespace linker.messenger.relay
MachineId = signInClientStore.Id, MachineId = signInClientStore.Id,
SecretKey = relayClientStore.Server.SecretKey, SecretKey = relayClientStore.Server.SecretKey,
UserId = signInClientStore.Server.UserId UserId = signInClientStore.Server.UserId
}); }).ConfigureAwait(false);
var tasks = Nodes.Select(async (c) => var tasks = Nodes.Select(async (c) =>
{ {
IPEndPoint ep = c.EndPoint == null || c.EndPoint.Address.Equals(IPAddress.Any) ? signInClientState.Connection.Address : c.EndPoint; IPEndPoint ep = c.EndPoint == null || c.EndPoint.Address.Equals(IPAddress.Any) ? signInClientState.Connection.Address : c.EndPoint;
@@ -57,7 +57,7 @@ namespace linker.messenger.relay
var resp = await ping.SendPingAsync(ep.Address, 1000); var resp = await ping.SendPingAsync(ep.Address, 1000);
c.Delay = resp.Status == IPStatus.Success ? (int)resp.RoundtripTime : -1; c.Delay = resp.Status == IPStatus.Success ? (int)resp.RoundtripTime : -1;
}); });
await Task.WhenAll(tasks); await Task.WhenAll(tasks).ConfigureAwait(false);
} }
} }
catch (Exception) catch (Exception)
@@ -70,7 +70,7 @@ namespace linker.messenger.relay
{ {
if (lastTicksManager.DiffLessEqual(3000)) if (lastTicksManager.DiffLessEqual(3000))
{ {
await TaskRelay(); await TaskRelay().ConfigureAwait(false);
} }
return true; return true;
}, 3000); }, 3000);

View File

@@ -14,7 +14,8 @@ namespace linker.messenger.relay.client
{ {
public List<IRelayClientTransport> Transports { get; private set; } public List<IRelayClientTransport> Transports { get; private set; }
private ConcurrentDictionary<string, bool> connectingDic = new ConcurrentDictionary<string, bool>(); private OperatingMultipleManager operating = new OperatingMultipleManager();
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>(); private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
private readonly IRelayClientStore relayClientStore; private readonly IRelayClientStore relayClientStore;
@@ -25,6 +26,7 @@ namespace linker.messenger.relay.client
this.signInClientStore = signInClientStore; this.signInClientStore = signInClientStore;
Transports = new List<IRelayClientTransport> { Transports = new List<IRelayClientTransport> {
new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore,signInClientState,messengerStore), new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore,signInClientState,messengerStore),
new RelayClientTransportSelfHostUdp(messengerSender,serializer,relayClientStore,signInClientState,messengerStore),
}; };
LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", Transports.Select(c => c.GetType().Name))}"); LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", Transports.Select(c => c.GetType().Name))}");
} }
@@ -55,6 +57,11 @@ namespace linker.messenger.relay.client
callbacks.Remove(callback); callbacks.Remove(callback);
} }
} }
public async Task<ITunnelConnection> ConnectAsync(string fromMachineId, string remoteMachineId, string transactionId, string nodeId, TunnelProtocolType protocol)
{
return await ConnectAsync(fromMachineId, remoteMachineId, transactionId, TunnelProtocolType.All & (~protocol), nodeId).ConfigureAwait(false);
}
/// <summary> /// <summary>
/// 中继连接对方 /// 中继连接对方
/// </summary> /// </summary>
@@ -62,22 +69,26 @@ namespace linker.messenger.relay.client
/// <param name="remoteMachineId">对方id</param> /// <param name="remoteMachineId">对方id</param>
/// <param name="transactionId">事务</param> /// <param name="transactionId">事务</param>
/// <returns></returns> /// <returns></returns>
public async Task<ITunnelConnection> ConnectAsync(string fromMachineId, string remoteMachineId, string transactionId, string nodeId = "") public async Task<ITunnelConnection> ConnectAsync(string fromMachineId, string remoteMachineId, string transactionId, TunnelProtocolType denyProtocols, string nodeId = "")
{ {
if (connectingDic.TryAdd(remoteMachineId, true) == false)
if (operating.StartOperation(remoteMachineId) == false)
{ {
return null; return null;
} }
try if (relayClientStore.Server.Disabled)
{ {
IRelayClientTransport transport = Transports.FirstOrDefault(c => c.Type == relayClientStore.Server.RelayType && relayClientStore.Server.Disabled == false);
if (transport == null)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay to {remoteMachineId} fail,transport not found {relayClientStore.Server.RelayType},{relayClientStore.Server.Disabled}");
return null; return null;
} }
foreach (IRelayClientTransport transport in Transports.Where(c => denyProtocols.HasFlag(c.ProtocolType) == false))
{
if (transport == null)
{
continue;
}
try
{
transport.RelayInfo170 relayInfo = new transport.RelayInfo170 transport.RelayInfo170 relayInfo = new transport.RelayInfo170
{ {
FlowingId = 0, FlowingId = 0,
@@ -95,19 +106,19 @@ namespace linker.messenger.relay.client
}; };
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Info($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} {relayInfo.ToJson()}"); LoggerHelper.Instance.Info($"relay {transport.Name} to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} {relayInfo.ToJson()}");
ITunnelConnection connection = await transport.RelayAsync(relayInfo).ConfigureAwait(false); ITunnelConnection connection = await transport.RelayAsync(relayInfo).ConfigureAwait(false);
if (connection != null) if (connection != null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}"); LoggerHelper.Instance.Debug($"relay {transport.Name} to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}");
ConnectedCallback(relayInfo, connection); ConnectedCallback(relayInfo, connection);
return connection; return connection;
} }
else else
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} fail,{relayInfo.ToJson()}"); LoggerHelper.Instance.Error($"relay {transport.Name} to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} fail,{relayInfo.ToJson()}");
} }
} }
@@ -117,9 +128,9 @@ namespace linker.messenger.relay.client
} }
finally finally
{ {
connectingDic.TryRemove(remoteMachineId, out _); operating.StopOperation(remoteMachineId);
}
} }
return null; return null;
} }
/// <summary> /// <summary>
@@ -129,7 +140,7 @@ namespace linker.messenger.relay.client
/// <returns></returns> /// <returns></returns>
public async Task<bool> OnBeginAsync(transport.RelayInfo170 relayInfo) public async Task<bool> OnBeginAsync(transport.RelayInfo170 relayInfo)
{ {
if (connectingDic.TryAdd(relayInfo.FromMachineId, true) == false) if (operating.StartOperation(relayInfo.FromMachineId) == false)
{ {
return false; return false;
} }
@@ -164,7 +175,7 @@ namespace linker.messenger.relay.client
} }
finally finally
{ {
connectingDic.TryRemove(relayInfo.FromMachineId, out _); operating.StopOperation(relayInfo.FromMachineId);
} }
return false; return false;
} }

View File

@@ -11,6 +11,8 @@ using System.Security.Cryptography.X509Certificates;
using System.Buffers; using System.Buffers;
using linker.messenger.relay.server; using linker.messenger.relay.server;
using linker.messenger.signin; using linker.messenger.signin;
using System.Text;
using System;
namespace linker.messenger.relay.client.transport namespace linker.messenger.relay.client.transport
{ {
@@ -44,7 +46,7 @@ namespace linker.messenger.relay.client.transport
try try
{ {
//问一下能不能中继 //问一下能不能中继
RelayAskResultInfo170 relayAskResultInfo = await RelayAsk(relayInfo); RelayAskResultInfo170 relayAskResultInfo = await RelayAsk(relayInfo).ConfigureAwait(false);
relayInfo.FlowingId = relayAskResultInfo.FlowingId; relayInfo.FlowingId = relayAskResultInfo.FlowingId;
if (relayInfo.FlowingId == 0 || relayAskResultInfo.Nodes.Count == 0) if (relayInfo.FlowingId == 0 || relayAskResultInfo.Nodes.Count == 0)
{ {
@@ -60,7 +62,7 @@ namespace linker.messenger.relay.client.transport
} }
//连接中继节点服务器 //连接中继节点服务器
Socket socket = await ConnectNodeServer(relayInfo, relayAskResultInfo.Nodes); Socket socket = await ConnectNodeServer(relayInfo, relayAskResultInfo.Nodes).ConfigureAwait(false);
if (socket == null) if (socket == null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
@@ -69,7 +71,7 @@ namespace linker.messenger.relay.client.transport
} }
//让对方确认中继 //让对方确认中继
if (await RelayConfirm(relayInfo) == false) if (await RelayConfirm(relayInfo).ConfigureAwait(false) == false)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay confirm fail,flowid:{relayInfo.FlowingId},nodes:{relayAskResultInfo.Nodes.Count}"); LoggerHelper.Instance.Error($"relay confirm fail,flowid:{relayInfo.FlowingId},nodes:{relayAskResultInfo.Nodes.Count}");
@@ -171,13 +173,13 @@ namespace linker.messenger.relay.client.transport
ToId = relayInfo.RemoteMachineId, ToId = relayInfo.RemoteMachineId,
NodeId = node.Id, NodeId = node.Id,
}; };
await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }); await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }).ConfigureAwait(false);
await socket.SendAsync(serializer.Serialize(relayMessage)); await socket.SendAsync(serializer.Serialize(relayMessage)).ConfigureAwait(false);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"relay connected {ep}"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"relay connected {ep}");
//是否允许连接 //是否允许连接
int length = await socket.ReceiveAsync(buffer.AsMemory(0, 1)); int length = await socket.ReceiveAsync(buffer.AsMemory(0, 1)).ConfigureAwait(false);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"relay connected {ep}->{buffer[0]}"); LoggerHelper.Instance.Debug($"relay connected {ep}->{buffer[0]}");
@@ -219,7 +221,7 @@ namespace linker.messenger.relay.client.transport
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.RelayForward170, MessengerId = (ushort)RelayMessengerIds.RelayForward170,
Payload = serializer.Serialize(relayInfo), Payload = serializer.Serialize(relayInfo),
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
@@ -246,8 +248,8 @@ namespace linker.messenger.relay.client.transport
ToId = relayInfo.RemoteMachineId, ToId = relayInfo.RemoteMachineId,
NodeId = relayInfo.NodeId, NodeId = relayInfo.NodeId,
}; };
await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }); await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }).ConfigureAwait(false);
await socket.SendAsync(serializer.Serialize(relayMessage)); await socket.SendAsync(serializer.Serialize(relayMessage)).ConfigureAwait(false);
_ = WaitSSL(socket, relayInfo).ContinueWith((result) => _ = WaitSSL(socket, relayInfo).ContinueWith((result) =>
{ {
@@ -337,6 +339,8 @@ namespace linker.messenger.relay.client.transport
public RelayClientType Type => RelayClientType.Linker; public RelayClientType Type => RelayClientType.Linker;
public TunnelProtocolType ProtocolType => TunnelProtocolType.Udp; public TunnelProtocolType ProtocolType => TunnelProtocolType.Udp;
private byte[] relayFlag = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.relay.flag");
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly ISerializer serializer; private readonly ISerializer serializer;
private readonly IRelayClientStore relayClientStore; private readonly IRelayClientStore relayClientStore;
@@ -358,7 +362,7 @@ namespace linker.messenger.relay.client.transport
try try
{ {
//问一下能不能中继 //问一下能不能中继
RelayAskResultInfo170 relayAskResultInfo = await RelayAsk(relayInfo); RelayAskResultInfo170 relayAskResultInfo = await RelayAsk(relayInfo).ConfigureAwait(false);
relayInfo.FlowingId = relayAskResultInfo.FlowingId; relayInfo.FlowingId = relayAskResultInfo.FlowingId;
if (relayInfo.FlowingId == 0 || relayAskResultInfo.Nodes.Count == 0) if (relayInfo.FlowingId == 0 || relayAskResultInfo.Nodes.Count == 0)
{ {
@@ -374,7 +378,7 @@ namespace linker.messenger.relay.client.transport
} }
//连接中继节点服务器 //连接中继节点服务器
Socket socket = await ConnectNodeServer(relayInfo, relayAskResultInfo.Nodes); var (socket, ep) = await ConnectNodeServer(relayInfo, relayAskResultInfo.Nodes).ConfigureAwait(false);
if (socket == null) if (socket == null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
@@ -383,40 +387,29 @@ namespace linker.messenger.relay.client.transport
} }
//让对方确认中继 //让对方确认中继
if (await RelayConfirm(relayInfo) == false) if (await RelayConfirm(relayInfo).ConfigureAwait(false) == false)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay confirm fail,flowid:{relayInfo.FlowingId},nodes:{relayAskResultInfo.Nodes.Count}"); LoggerHelper.Instance.Error($"relay confirm fail,flowid:{relayInfo.FlowingId},nodes:{relayAskResultInfo.Nodes.Count}");
return null; return null;
} }
//成功建立连接, return new TunnelConnectionUdp
SslStream sslStream = null;
if (relayInfo.SSL)
{ {
sslStream = new SslStream(new NetworkStream(socket, false), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); UdpClient = socket,
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions IPEndPoint = NetworkHelper.TransEndpointFamily(ep),
{ TransactionId = relayInfo.TransactionId,
EnabledSslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls
}).ConfigureAwait(false);
}
return new TunnelConnectionTcp
{
Direction = TunnelDirection.Forward,
ProtocolType = TunnelProtocolType.Tcp,
RemoteMachineId = relayInfo.RemoteMachineId, RemoteMachineId = relayInfo.RemoteMachineId,
RemoteMachineName = relayInfo.RemoteMachineName, RemoteMachineName = relayInfo.RemoteMachineName,
Stream = sslStream,
Socket = socket,
Mode = TunnelMode.Client,
IPEndPoint = NetworkHelper.TransEndpointFamily(socket.RemoteEndPoint as IPEndPoint),
TransactionId = relayInfo.TransactionId,
TransportName = Name, TransportName = Name,
Direction = TunnelDirection.Forward,
ProtocolType = ProtocolType,
Type = TunnelType.Relay, Type = TunnelType.Relay,
NodeId = relayInfo.NodeId, Mode = TunnelMode.Client,
Label = string.Empty,
Receive = true,
SSL = relayInfo.SSL, SSL = relayInfo.SSL,
BufferSize = 3 Crypto = CryptoFactory.CreateSymmetric(relayInfo.RemoteMachineId)
}; };
} }
catch (Exception ex) catch (Exception ex)
@@ -452,9 +445,9 @@ namespace linker.messenger.relay.client.transport
return result; return result;
} }
private async Task<Socket> ConnectNodeServer(RelayInfo170 relayInfo, List<RelayServerNodeReportInfo170> nodes) private async Task<(Socket, IPEndPoint)> ConnectNodeServer(RelayInfo170 relayInfo, List<RelayServerNodeReportInfo170> nodes)
{ {
byte[] buffer = ArrayPool<byte>.Shared.Rent(1 * 1024); byte[] buffer = ArrayPool<byte>.Shared.Rent(4 * 1024);
try try
{ {
@@ -472,9 +465,8 @@ namespace linker.messenger.relay.client.transport
LoggerHelper.Instance.Debug($"connect relay server {ep}"); LoggerHelper.Instance.Debug($"connect relay server {ep}");
//连接中继服务器 //连接中继服务器
Socket socket = new Socket(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); Socket socket = new Socket(ep.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
socket.KeepAlive(); socket.WindowsUdpBug();
await socket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
//建立关联 //建立关联
RelayMessageInfo relayMessage = new RelayMessageInfo RelayMessageInfo relayMessage = new RelayMessageInfo
@@ -485,21 +477,18 @@ namespace linker.messenger.relay.client.transport
ToId = relayInfo.RemoteMachineId, ToId = relayInfo.RemoteMachineId,
NodeId = node.Id, NodeId = node.Id,
}; };
await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }); await socket.SendToAsync(BuildPacket(buffer, relayMessage), ep).ConfigureAwait(false);
await socket.SendAsync(serializer.Serialize(relayMessage));
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"relay connected {ep}");
//是否允许连接 //是否允许连接
int length = await socket.ReceiveAsync(buffer.AsMemory(0, 1)); IPEndPoint temp = new IPEndPoint(IPAddress.Any, 0);
SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, temp).ConfigureAwait(false);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"relay connected {ep}->{buffer[0]}"); LoggerHelper.Instance.Debug($"relay connected {ep}->{buffer[0]}");
if (buffer[0] == 0) if (buffer[0] == 0)
{ {
relayInfo.Server = node.EndPoint; relayInfo.Server = node.EndPoint;
relayInfo.NodeId = node.Id; relayInfo.NodeId = node.Id;
return socket; return (socket, ep);
} }
socket.SafeClose(); socket.SafeClose();
} }
@@ -523,8 +512,26 @@ namespace linker.messenger.relay.client.transport
{ {
ArrayPool<byte>.Shared.Return(buffer); ArrayPool<byte>.Shared.Return(buffer);
} }
return null; return (null, null);
} }
private Memory<byte> BuildPacket(byte[] buffer,RelayMessageInfo relayMessage)
{
int index = 0;
buffer[0] = (byte)ResolverType.Relay;
buffer[1] = (byte)RelayUdpStep.Connect;
buffer[2] = (byte)relayFlag.Length;
index += 3;
relayFlag.AsMemory().CopyTo(buffer.AsMemory(index));
index += relayFlag.Length;
byte[] bytes = serializer.Serialize(relayMessage);
bytes.AsMemory().CopyTo(buffer.AsMemory(index));
index += bytes.Length;
return buffer.AsMemory(0, index);
}
private async Task<bool> RelayConfirm(RelayInfo170 relayInfo) private async Task<bool> RelayConfirm(RelayInfo170 relayInfo)
{ {
//通知对方去确认中继 //通知对方去确认中继
@@ -533,24 +540,18 @@ namespace linker.messenger.relay.client.transport
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.RelayForward170, MessengerId = (ushort)RelayMessengerIds.RelayForward170,
Payload = serializer.Serialize(relayInfo), Payload = serializer.Serialize(relayInfo),
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public async Task<bool> OnBeginAsync(RelayInfo170 relayInfo, Action<ITunnelConnection> callback) public async Task<bool> OnBeginAsync(RelayInfo170 relayInfo, Action<ITunnelConnection> callback)
{ {
byte[] buffer = ArrayPool<byte>.Shared.Rent(4096);
try try
{ {
IPEndPoint ep = relayInfo.Server == null || relayInfo.Server.Address.Equals(IPAddress.Any) ? signInClientState.Connection.Address : relayInfo.Server; IPEndPoint ep = relayInfo.Server == null || relayInfo.Server.Address.Equals(IPAddress.Any) ? signInClientState.Connection.Address : relayInfo.Server;
Socket socket = new Socket(ep.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);
Socket socket = new Socket(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); socket.WindowsUdpBug();
socket.KeepAlive();
await socket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
RelayMessageInfo relayMessage = new RelayMessageInfo RelayMessageInfo relayMessage = new RelayMessageInfo
{ {
@@ -560,14 +561,25 @@ namespace linker.messenger.relay.client.transport
ToId = relayInfo.RemoteMachineId, ToId = relayInfo.RemoteMachineId,
NodeId = relayInfo.NodeId, NodeId = relayInfo.NodeId,
}; };
await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }); await socket.SendToAsync(BuildPacket(buffer, relayMessage), ep).ConfigureAwait(false);
await socket.SendAsync(serializer.Serialize(relayMessage));
_ = WaitSSL(socket, relayInfo).ContinueWith((result) => callback(new TunnelConnectionUdp
{ {
callback(result.Result); UdpClient = socket,
IPEndPoint = NetworkHelper.TransEndpointFamily(ep),
TransactionId = relayInfo.TransactionId,
RemoteMachineId = relayInfo.RemoteMachineId,
RemoteMachineName = relayInfo.RemoteMachineName,
TransportName = Name,
Direction = TunnelDirection.Forward,
ProtocolType = ProtocolType,
Type = TunnelType.Relay,
Mode = TunnelMode.Server,
Label = string.Empty,
Receive = true,
SSL = relayInfo.SSL,
Crypto = CryptoFactory.CreateSymmetric(relayInfo.RemoteMachineId)
}); });
return true; return true;
} }
catch (Exception ex) catch (Exception ex)
@@ -578,48 +590,13 @@ namespace linker.messenger.relay.client.transport
} }
callback(null); callback(null);
} }
finally
{
ArrayPool<byte>.Shared.Return(buffer);
}
return false; return false;
} }
private async Task<TunnelConnectionTcp> WaitSSL(Socket socket, RelayInfo170 relayInfo)
{
try
{
SslStream sslStream = null;
if (relayInfo.SSL)
{
sslStream = new SslStream(new NetworkStream(socket, false), false);
await sslStream.AuthenticateAsServerAsync(messengerStore.Certificate, false, SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls, false).ConfigureAwait(false);
}
return new TunnelConnectionTcp
{
Direction = TunnelDirection.Reverse,
ProtocolType = TunnelProtocolType.Tcp,
RemoteMachineId = relayInfo.RemoteMachineId,
RemoteMachineName = relayInfo.RemoteMachineName,
Stream = sslStream,
Socket = socket,
Mode = TunnelMode.Server,
IPEndPoint = NetworkHelper.TransEndpointFamily(socket.RemoteEndPoint as IPEndPoint),
TransactionId = relayInfo.TransactionId,
TransportName = Name,
Type = TunnelType.Relay,
NodeId = relayInfo.NodeId,
SSL = relayInfo.SSL,
BufferSize = 3,
};
}
catch (Exception ex)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
}
socket.SafeClose();
}
return null;
}
public async Task<List<RelayServerNodeReportInfo170>> RelayTestAsync(RelayTestInfo170 relayTestInfo) public async Task<List<RelayServerNodeReportInfo170>> RelayTestAsync(RelayTestInfo170 relayTestInfo)
{ {
try try

View File

@@ -5,8 +5,6 @@ using linker.messenger.relay.client;
using linker.messenger.relay.server; using linker.messenger.relay.server;
using linker.messenger.signin; using linker.messenger.signin;
using linker.messenger.relay.server.validator; using linker.messenger.relay.server.validator;
using linker.libs.extends;
using System.Collections.Generic;
namespace linker.messenger.relay.messenger namespace linker.messenger.relay.messenger
{ {
@@ -76,7 +74,7 @@ namespace linker.messenger.relay.messenger
List<RelayServerNodeReportInfo> list = relayServerTransfer.GetNodes(validated).Select(c => (RelayServerNodeReportInfo)c).ToList(); List<RelayServerNodeReportInfo> list = relayServerTransfer.GetNodes(validated).Select(c => (RelayServerNodeReportInfo)c).ToList();
return serializer.Serialize(list); return serializer.Serialize(list);
}); }).ConfigureAwait(false);
} }
[MessengerId((ushort)RelayMessengerIds.RelayTest170)] [MessengerId((ushort)RelayMessengerIds.RelayTest170)]
public async Task RelayTest170(IConnection connection) public async Task RelayTest170(IConnection connection)
@@ -85,7 +83,7 @@ namespace linker.messenger.relay.messenger
await RelayTest(connection, info, (validated) => await RelayTest(connection, info, (validated) =>
{ {
return serializer.Serialize(relayServerTransfer.GetNodes(validated)); return serializer.Serialize(relayServerTransfer.GetNodes(validated));
}); }).ConfigureAwait(false);
} }
private async Task RelayTest(IConnection connection, RelayTestInfo info, Func<bool, byte[]> data) private async Task RelayTest(IConnection connection, RelayTestInfo info, Func<bool, byte[]> data)
{ {
@@ -101,7 +99,7 @@ namespace linker.messenger.relay.messenger
FromMachineName = cache.MachineName, FromMachineName = cache.MachineName,
TransactionId = "test", TransactionId = "test",
TransportName = "test", TransportName = "test",
}, cache, null); }, cache, null).ConfigureAwait(false);
connection.Write(data(string.IsNullOrWhiteSpace(result))); connection.Write(data(string.IsNullOrWhiteSpace(result)));
} }
@@ -126,7 +124,7 @@ namespace linker.messenger.relay.messenger
info.FromMachineName = cacheFrom.MachineName; info.FromMachineName = cacheFrom.MachineName;
RelayAskResultInfo result = new RelayAskResultInfo(); RelayAskResultInfo result = new RelayAskResultInfo();
string error = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo); string error = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo).ConfigureAwait(false);
bool validated = string.IsNullOrWhiteSpace(error); bool validated = string.IsNullOrWhiteSpace(error);
result.Nodes = relayServerTransfer.GetNodes(validated).Select(c => (RelayServerNodeReportInfo)c).ToList(); result.Nodes = relayServerTransfer.GetNodes(validated).Select(c => (RelayServerNodeReportInfo)c).ToList();
@@ -153,14 +151,14 @@ namespace linker.messenger.relay.messenger
info.FromMachineName = cacheFrom.MachineName; info.FromMachineName = cacheFrom.MachineName;
RelayAskResultInfo170 result = new RelayAskResultInfo170(); RelayAskResultInfo170 result = new RelayAskResultInfo170();
string error = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo); string error = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo).ConfigureAwait(false);
bool validated = string.IsNullOrWhiteSpace(error); bool validated = string.IsNullOrWhiteSpace(error);
result.Nodes = relayServerTransfer.GetNodes(validated); result.Nodes = relayServerTransfer.GetNodes(validated);
if (result.Nodes.Count > 0) if (result.Nodes.Count > 0)
{ {
List<RelayServerCdkeyInfo> cdkeys = info.UseCdkey List<RelayServerCdkeyInfo> cdkeys = info.UseCdkey
? (await relayServerCdkeyStore.GetAvailable(info.UserId)).Select(c => new RelayServerCdkeyInfo { Bandwidth = c.Bandwidth, Id = c.Id, LastBytes = c.LastBytes }).ToList() ? (await relayServerCdkeyStore.GetAvailable(info.UserId).ConfigureAwait(false)).Select(c => new RelayServerCdkeyInfo { Bandwidth = c.Bandwidth, Id = c.Id, LastBytes = c.LastBytes }).ToList()
: new List<RelayServerCdkeyInfo>(); : new List<RelayServerCdkeyInfo>();
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);
@@ -181,7 +179,7 @@ namespace linker.messenger.relay.messenger
await RelayForward(connection, info, () => await RelayForward(connection, info, () =>
{ {
return serializer.Serialize(info); return serializer.Serialize(info);
}); }).ConfigureAwait(false);
} }
[MessengerId((ushort)RelayMessengerIds.RelayForward170)] [MessengerId((ushort)RelayMessengerIds.RelayForward170)]
public async Task RelayForward170(IConnection connection) public async Task RelayForward170(IConnection connection)
@@ -190,7 +188,7 @@ namespace linker.messenger.relay.messenger
await RelayForward(connection, info, () => await RelayForward(connection, info, () =>
{ {
return serializer.Serialize(info); return serializer.Serialize(info);
}); }).ConfigureAwait(false);
} }
public async Task RelayForward(IConnection connection, RelayInfo info, Func<byte[]> data) public async Task RelayForward(IConnection connection, RelayInfo info, Func<byte[]> data)
{ {
@@ -207,7 +205,7 @@ namespace linker.messenger.relay.messenger
info.FromMachineId = cacheFrom.MachineId; info.FromMachineId = cacheFrom.MachineId;
info.RemoteMachineName = cacheTo.MachineName; info.RemoteMachineName = cacheTo.MachineName;
info.FromMachineName = cacheFrom.MachineName; info.FromMachineName = cacheFrom.MachineName;
string result = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo); string result = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(result) == false) if (string.IsNullOrWhiteSpace(result) == false)
{ {
connection.Write(Helper.FalseArray); connection.Write(Helper.FalseArray);
@@ -292,7 +290,7 @@ namespace linker.messenger.relay.messenger
RelayServerNodeUpdateWrapInfo info = serializer.Deserialize<RelayServerNodeUpdateWrapInfo>(connection.ReceiveRequestWrap.Payload.Span); RelayServerNodeUpdateWrapInfo info = serializer.Deserialize<RelayServerNodeUpdateWrapInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (info.SecretKey == relayServerStore.SecretKey) if (info.SecretKey == relayServerStore.SecretKey)
{ {
await relayServerTransfer.UpdateNodeReport(info.Info); await relayServerTransfer.UpdateNodeReport(info.Info).ConfigureAwait(false);
connection.Write(Helper.TrueArray); connection.Write(Helper.TrueArray);
} }
else else
@@ -356,7 +354,7 @@ namespace linker.messenger.relay.messenger
return; return;
} }
await relayServerCdkeyStore.Add(info.Data); await relayServerCdkeyStore.Add(info.Data).ConfigureAwait(false);
connection.Write(Helper.TrueArray); connection.Write(Helper.TrueArray);
} }
@@ -376,11 +374,11 @@ namespace linker.messenger.relay.messenger
} }
if (relayServerStore.SecretKey == info.SecretKey) if (relayServerStore.SecretKey == info.SecretKey)
{ {
await relayServerCdkeyStore.Del(info.Id); await relayServerCdkeyStore.Del(info.Id).ConfigureAwait(false);
} }
else else
{ {
await relayServerCdkeyStore.Del(info.Id, info.UserId); await relayServerCdkeyStore.Del(info.Id, info.UserId).ConfigureAwait(false);
} }
connection.Write(Helper.TrueArray); connection.Write(Helper.TrueArray);
} }
@@ -405,7 +403,7 @@ namespace linker.messenger.relay.messenger
return; return;
} }
var page = await relayServerCdkeyStore.Page(info); var page = await relayServerCdkeyStore.Page(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(page)); connection.Write(serializer.Serialize(page));
} }
@@ -430,7 +428,7 @@ namespace linker.messenger.relay.messenger
connection.Write(serializer.Serialize(new RelayServerCdkeyTestResultInfo { })); connection.Write(serializer.Serialize(new RelayServerCdkeyTestResultInfo { }));
return; return;
} }
RelayServerCdkeyTestResultInfo test = await relayServerCdkeyStore.Test(info); RelayServerCdkeyTestResultInfo test = await relayServerCdkeyStore.Test(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(test)); connection.Write(serializer.Serialize(test));
} }
@@ -448,7 +446,7 @@ namespace linker.messenger.relay.messenger
connection.Write(Helper.FalseArray); connection.Write(Helper.FalseArray);
return; return;
} }
string result = await relayServerCdkeyStore.Import(info); string result = await relayServerCdkeyStore.Import(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(result)); connection.Write(serializer.Serialize(result));
} }
} }

View File

@@ -2,6 +2,7 @@
using System.Net; using System.Net;
using linker.libs.extends; using linker.libs.extends;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using linker.tunnel.connection;
namespace linker.messenger.relay.server namespace linker.messenger.relay.server
{ {
@@ -80,6 +81,9 @@ namespace linker.messenger.relay.server
public string MasterSecretKey { get; set; } = string.Empty; public string MasterSecretKey { get; set; } = string.Empty;
#endif #endif
public string Url { get; set; } = "https://linker-doc.snltty.com"; public string Url { get; set; } = "https://linker-doc.snltty.com";
public bool AllowTcp { get; set; } = true;
public bool AllowUdp { get; set; } = false;
} }
public sealed partial class RelayServerNodeUpdateWrapInfo public sealed partial class RelayServerNodeUpdateWrapInfo
@@ -100,6 +104,9 @@ namespace linker.messenger.relay.server
public bool Public { get; set; } public bool Public { get; set; }
public string Url { get; set; } = "https://linker-doc.snltty.com"; public string Url { get; set; } = "https://linker-doc.snltty.com";
public bool AllowTcp { get; set; } = true;
public bool AllowUdp { get; set; } = false;
} }
public partial class RelayServerNodeReportInfo public partial class RelayServerNodeReportInfo
{ {
@@ -123,9 +130,10 @@ namespace linker.messenger.relay.server
public long LastTicks { get; set; } public long LastTicks { get; set; }
} }
public sealed partial class RelayServerNodeReportInfo170: RelayServerNodeReportInfo public sealed partial class RelayServerNodeReportInfo170 : RelayServerNodeReportInfo
{ {
public string Url { get; set; } = "https://linker-doc.snltty.com"; public string Url { get; set; } = "https://linker-doc.snltty.com";
public TunnelProtocolType AllowProtocol { get; set; } = TunnelProtocolType.Tcp;
[JsonIgnore] [JsonIgnore]
public IConnection Connection { get; set; } public IConnection Connection { get; set; }

View File

@@ -109,7 +109,7 @@ namespace linker.messenger.relay.server
Connection = cache.Connection, Connection = cache.Connection,
MessengerId = (ushort)RelayMessengerIds.UpdateNode, MessengerId = (ushort)RelayMessengerIds.UpdateNode,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
} }
} }
@@ -198,7 +198,7 @@ namespace linker.messenger.relay.server
Connection = c.Connection, Connection = c.Connection,
MessengerId = (ushort)RelayMessengerIds.SendLastBytes, MessengerId = (ushort)RelayMessengerIds.SendLastBytes,
Payload = bytes, Payload = bytes,
})).ToList()); })).ToList()).ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -1,6 +1,7 @@
using linker.libs; using linker.libs;
using linker.libs.extends; using linker.libs.extends;
using linker.messenger.relay.messenger; using linker.messenger.relay.messenger;
using linker.tunnel.connection;
using System.Buffers; using System.Buffers;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Net; using System.Net;
@@ -16,7 +17,7 @@ namespace linker.messenger.relay.server
/// <summary> /// <summary>
/// 配置了就用配置的,每配置就用一个默认的 /// 配置了就用配置的,每配置就用一个默认的
/// </summary> /// </summary>
public RelayServerNodeInfo node = null; public RelayServerNodeInfo node => relayServerNodeStore.Node;
private uint connectionNum = 0; private uint connectionNum = 0;
private IConnection connection; private IConnection connection;
@@ -40,21 +41,14 @@ namespace linker.messenger.relay.server
this.messengerResolver = messengerResolver; this.messengerResolver = messengerResolver;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
node = string.IsNullOrWhiteSpace(relayServerNodeStore.Node.MasterHost) ? new RelayServerNodeInfo if (string.IsNullOrWhiteSpace(relayServerNodeStore.Node.MasterHost))
{ {
Id = "824777CF-2804-83FE-DE71-69B7B7D3BBA7", relayServerNodeStore.Node.Host = new IPEndPoint(IPAddress.Any, relayServerNodeStore.ServicePort).ToString();
Host = new IPEndPoint(IPAddress.Any, relayServerNodeStore.ServicePort).ToString(), relayServerNodeStore.Node.MasterHost = new IPEndPoint(IPAddress.Loopback, relayServerNodeStore.ServicePort).ToString();
MasterHost = new IPEndPoint(IPAddress.Loopback, relayServerNodeStore.ServicePort).ToString(), relayServerNodeStore.Node.MasterSecretKey = relayServerMasterStore.Master.SecretKey;
MasterSecretKey = relayServerMasterStore.Master.SecretKey, relayServerNodeStore.Node.Name = "default";
MaxBandwidth = 0, relayServerNodeStore.Node.Public = false;
MaxConnection = 0, }
MaxBandwidthTotal = 0,
MaxGbTotal = 0,
MaxGbTotalLastBytes = 0,
MaxGbTotalMonth = 0,
Name = "default",
Public = false,
} : relayServerNodeStore.Node;
limitTotal.SetLimit((uint)Math.Ceiling((node.MaxBandwidthTotal * 1024 * 1024) / 8.0)); limitTotal.SetLimit((uint)Math.Ceiling((node.MaxBandwidthTotal * 1024 * 1024) / 8.0));
@@ -64,6 +58,8 @@ namespace linker.messenger.relay.server
} }
public async ValueTask<RelayCacheInfo> TryGetRelayCache(string key) public async ValueTask<RelayCacheInfo> TryGetRelayCache(string key)
{ {
try try
@@ -73,7 +69,7 @@ namespace linker.messenger.relay.server
Connection = connection, Connection = connection,
MessengerId = (ushort)RelayMessengerIds.NodeGetCache, MessengerId = (ushort)RelayMessengerIds.NodeGetCache,
Payload = serializer.Serialize(key) Payload = serializer.Serialize(key)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
return serializer.Deserialize<RelayCacheInfo>(resp.Data.Span); return serializer.Deserialize<RelayCacheInfo>(resp.Data.Span);
@@ -90,9 +86,20 @@ namespace linker.messenger.relay.server
public void UpdateNode(RelayServerNodeUpdateInfo info) public void UpdateNode(RelayServerNodeUpdateInfo info)
{ {
if (info.Id == node.Id) if (info.Id == node.Id)
{
relayServerNodeStore.UpdateInfo(info); relayServerNodeStore.UpdateInfo(info);
relayServerNodeStore.Confirm();
}
} }
public bool Validate(TunnelProtocolType tunnelProtocolType)
{
if (tunnelProtocolType == TunnelProtocolType.Udp && node.AllowUdp == false) return false;
if (tunnelProtocolType == TunnelProtocolType.Tcp && node.AllowTcp == false) return false;
return true;
}
/// <summary> /// <summary>
/// 无效请求 /// 无效请求
/// </summary> /// </summary>
@@ -296,7 +303,7 @@ namespace linker.messenger.relay.server
SecretKey = node.MasterSecretKey SecretKey = node.MasterSecretKey
}), }),
Timeout = 4000 Timeout = 4000
}); }).ConfigureAwait(false);
if (result) if (result)
{ {
@@ -320,7 +327,7 @@ namespace linker.messenger.relay.server
try try
{ {
ResetNodeBytes(); ResetNodeBytes();
await UploadBytes(); await UploadBytes().ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -339,7 +346,7 @@ namespace linker.messenger.relay.server
try try
{ {
IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, relayServerNodeStore.ServicePort) ?? new IPEndPoint(IPAddress.Any, relayServerNodeStore.ServicePort); IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, relayServerNodeStore.ServicePort).ConfigureAwait(false) ?? new IPEndPoint(IPAddress.Any, relayServerNodeStore.ServicePort);
RelayServerNodeReportInfo170 relayNodeReportInfo = new RelayServerNodeReportInfo170 RelayServerNodeReportInfo170 relayNodeReportInfo = new RelayServerNodeReportInfo170
{ {
Id = node.Id, Id = node.Id,
@@ -353,14 +360,16 @@ namespace linker.messenger.relay.server
MaxConnection = node.MaxConnection, MaxConnection = node.MaxConnection,
ConnectionRatio = connectionNum, ConnectionRatio = connectionNum,
EndPoint = endPoint, EndPoint = endPoint,
Url = node.Url Url = node.Url,
AllowProtocol = (node.AllowTcp ? TunnelProtocolType.Tcp :TunnelProtocolType.None)
| (node.AllowUdp ? TunnelProtocolType.Udp : TunnelProtocolType.None)
}; };
await messengerSender.SendOnly(new MessageRequestWrap await messengerSender.SendOnly(new MessageRequestWrap
{ {
Connection = connection, Connection = connection,
MessengerId = (ushort)RelayMessengerIds.NodeReport, MessengerId = (ushort)RelayMessengerIds.NodeReport,
Payload = serializer.Serialize(relayNodeReportInfo) Payload = serializer.Serialize(relayNodeReportInfo)
}); }).ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -395,7 +404,7 @@ namespace linker.messenger.relay.server
secretKeyBytes.AsSpan().CopyTo(bytes.AsSpan(1)); secretKeyBytes.AsSpan().CopyTo(bytes.AsSpan(1));
IPEndPoint remote = await NetworkHelper.GetEndPointAsync(host, 1802); IPEndPoint remote = await NetworkHelper.GetEndPointAsync(host, 1802).ConfigureAwait(false);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{ {
LoggerHelper.Instance.Warning($"relay node sign in to {remote}"); LoggerHelper.Instance.Warning($"relay node sign in to {remote}");

View File

@@ -48,7 +48,7 @@ namespace linker.messenger.relay.server
if (relayServerMasterStore.Master.SecretKey.Md5() == key) if (relayServerMasterStore.Master.SecretKey.Md5() == key)
{ {
await messengerResolver.BeginReceiveServer(socket, Helper.EmptyArray); await messengerResolver.BeginReceiveServer(socket, Helper.EmptyArray).ConfigureAwait(false);
} }
else else
{ {
@@ -71,7 +71,7 @@ namespace linker.messenger.relay.server
public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory) public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
} }
} }

View File

@@ -5,6 +5,7 @@ using System.Collections.Concurrent;
using System.Net; using System.Net;
using linker.libs; using linker.libs;
using System; using System;
using System.Text;
namespace linker.messenger.relay.server namespace linker.messenger.relay.server
{ {
@@ -17,6 +18,9 @@ namespace linker.messenger.relay.server
private readonly RelayServerNodeTransfer relayServerNodeTransfer; private readonly RelayServerNodeTransfer relayServerNodeTransfer;
private readonly ISerializer serializer; private readonly ISerializer serializer;
private string relayFlag = $"{Helper.GlobalString}.relay.flag";
public RelayServerResolver(RelayServerNodeTransfer relayServerNodeTransfer, ISerializer serializer) public RelayServerResolver(RelayServerNodeTransfer relayServerNodeTransfer, ISerializer serializer)
{ {
this.relayServerNodeTransfer = relayServerNodeTransfer; this.relayServerNodeTransfer = relayServerNodeTransfer;
@@ -44,6 +48,11 @@ namespace linker.messenger.relay.server
public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory) public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory)
{ {
if (relayServerNodeTransfer.Validate(tunnel.connection.TunnelProtocolType.Udp) == false)
{
return;
}
RelayUdpStep step = (RelayUdpStep)memory.Span[0]; RelayUdpStep step = (RelayUdpStep)memory.Span[0];
memory = memory.Slice(1); memory = memory.Slice(1);
@@ -52,22 +61,30 @@ namespace linker.messenger.relay.server
if (udpNat.TryGetValue(ep, out RelayUdpNatInfo natTarget) && natTarget.Target != null) if (udpNat.TryGetValue(ep, out RelayUdpNatInfo natTarget) && natTarget.Target != null)
{ {
natTarget.LastTicks = Environment.TickCount64; natTarget.LastTicks = Environment.TickCount64;
await CopyToAsync(natTarget, socket,ep,memory); await CopyToAsync(natTarget, socket, ep, memory).ConfigureAwait(false);
} }
return; return;
} }
byte flagLength = memory.Span[0];
if(Encoding.UTF8.GetString(memory.Slice(1, flagLength).Span) != relayFlag)
{
await socket.SendToAsync(new byte[] { 1 }, ep).ConfigureAwait(false);
return;
}
memory = memory.Slice(1 + flagLength);
RelayMessageInfo relayMessage = serializer.Deserialize<RelayMessageInfo>(memory.Span); RelayMessageInfo relayMessage = serializer.Deserialize<RelayMessageInfo>(memory.Span);
//ask 是发起端来的那key就是 发起端->目标端, answer的目标和来源会交换所以转换一下 //ask 是发起端来的那key就是 发起端->目标端, answer的目标和来源会交换所以转换一下
string key = relayMessage.Type == RelayMessengerType.Ask ? $"{relayMessage.FromId}->{relayMessage.ToId}->{relayMessage.FlowId}" : $"{relayMessage.ToId}->{relayMessage.FromId}->{relayMessage.FlowId}"; string key = relayMessage.Type == RelayMessengerType.Ask ? $"{relayMessage.FromId}->{relayMessage.ToId}->{relayMessage.FlowId}" : $"{relayMessage.ToId}->{relayMessage.FromId}->{relayMessage.FlowId}";
//获取缓存 //获取缓存
RelayCacheInfo relayCache = await relayServerNodeTransfer.TryGetRelayCache(key); RelayCacheInfo relayCache = await relayServerNodeTransfer.TryGetRelayCache(key).ConfigureAwait(false);
if (relayCache == null) if (relayCache == null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay {relayMessage.Type} get cache fail,flowid:{relayMessage.FlowId}"); LoggerHelper.Instance.Error($"relay {relayMessage.Type} get cache fail,flowid:{relayMessage.FlowId}");
await socket.SendToAsync(new byte[] { 1 }, ep); await socket.SendToAsync(new byte[] { 1 }, ep).ConfigureAwait(false);
return; return;
} }
@@ -75,13 +92,12 @@ namespace linker.messenger.relay.server
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay {relayMessage.Type} Validate false,flowid:{relayMessage.FlowId}"); LoggerHelper.Instance.Error($"relay {relayMessage.Type} Validate false,flowid:{relayMessage.FlowId}");
await socket.SendToAsync(new byte[] { 1 }, ep); await socket.SendToAsync(new byte[] { 1 }, ep).ConfigureAwait(false);
return; return;
} }
//流量统计 //流量统计
AddReceive(relayCache.FromId, relayCache.FromName, relayCache.ToName, relayCache.GroupId, memory.Length); AddReceive(relayCache.FromId, relayCache.FromName, relayCache.ToName, relayCache.GroupId, memory.Length);
//回应 //回应
if (relayMessage.Type == RelayMessengerType.Answer) if (relayMessage.Type == RelayMessengerType.Answer)
{ {
@@ -104,6 +120,8 @@ namespace linker.messenger.relay.server
relayServerNodeTransfer.AddTrafficCache(trafficCacheInfo); relayServerNodeTransfer.AddTrafficCache(trafficCacheInfo);
relayServerNodeTransfer.IncrementConnectionNum(); relayServerNodeTransfer.IncrementConnectionNum();
await socket.SendToAsync(new byte[] { 0 }, ep).ConfigureAwait(false);
} }
private async Task CopyToAsync(RelayUdpNatInfo nat, Socket socket, IPEndPoint ep, Memory<byte> memory) private async Task CopyToAsync(RelayUdpNatInfo nat, Socket socket, IPEndPoint ep, Memory<byte> memory)
{ {
@@ -133,6 +151,12 @@ namespace linker.messenger.relay.server
public async Task Resolve(Socket socket, Memory<byte> memory) public async Task Resolve(Socket socket, Memory<byte> memory)
{ {
if (relayServerNodeTransfer.Validate(tunnel.connection.TunnelProtocolType.Tcp) == false)
{
socket.SafeClose();
return;
}
byte[] buffer1 = new byte[8 * 1024]; byte[] buffer1 = new byte[8 * 1024];
try try
{ {
@@ -142,12 +166,12 @@ namespace linker.messenger.relay.server
//ask 是发起端来的那key就是 发起端->目标端, answer的目标和来源会交换所以转换一下 //ask 是发起端来的那key就是 发起端->目标端, answer的目标和来源会交换所以转换一下
string key = relayMessage.Type == RelayMessengerType.Ask ? $"{relayMessage.FromId}->{relayMessage.ToId}->{relayMessage.FlowId}" : $"{relayMessage.ToId}->{relayMessage.FromId}->{relayMessage.FlowId}"; string key = relayMessage.Type == RelayMessengerType.Ask ? $"{relayMessage.FromId}->{relayMessage.ToId}->{relayMessage.FlowId}" : $"{relayMessage.ToId}->{relayMessage.FromId}->{relayMessage.FlowId}";
//获取缓存 //获取缓存
RelayCacheInfo relayCache = await relayServerNodeTransfer.TryGetRelayCache(key); RelayCacheInfo relayCache = await relayServerNodeTransfer.TryGetRelayCache(key).ConfigureAwait(false);
if (relayCache == null) if (relayCache == null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay {relayMessage.Type} get cache fail,flowid:{relayMessage.FlowId}"); LoggerHelper.Instance.Error($"relay {relayMessage.Type} get cache fail,flowid:{relayMessage.FlowId}");
await socket.SendAsync(new byte[] { 1 }); await socket.SendAsync(new byte[] { 1 }).ConfigureAwait(false);
socket.SafeClose(); socket.SafeClose();
return; return;
} }
@@ -156,7 +180,7 @@ namespace linker.messenger.relay.server
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"relay {relayMessage.Type} validate false,flowid:{relayMessage.FlowId}"); LoggerHelper.Instance.Error($"relay {relayMessage.Type} validate false,flowid:{relayMessage.FlowId}");
await socket.SendAsync(new byte[] { 1 }); await socket.SendAsync(new byte[] { 1 }).ConfigureAwait(false);
socket.SafeClose(); socket.SafeClose();
return; return;
} }
@@ -179,11 +203,11 @@ namespace linker.messenger.relay.server
try try
{ {
await socket.SendAsync(new byte[] { 0 }); await socket.SendAsync(new byte[] { 0 }).ConfigureAwait(false);
TaskCompletionSource<Socket> tcs = new TaskCompletionSource<Socket>(); TaskCompletionSource<Socket> tcs = new TaskCompletionSource<Socket>();
relayDic.TryAdd(relayCache.FlowId, tcs); relayDic.TryAdd(relayCache.FlowId, tcs);
Socket answerSocket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(15000)); Socket answerSocket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(15000)).ConfigureAwait(false);
byte[] buffer2 = new byte[8 * 1024]; byte[] buffer2 = new byte[8 * 1024];
RelayTrafficCacheInfo trafficCacheInfo = new RelayTrafficCacheInfo { Cache = relayCache, Sendt = 0, Limit = new RelaySpeedLimit() }; RelayTrafficCacheInfo trafficCacheInfo = new RelayTrafficCacheInfo { Cache = relayCache, Sendt = 0, Limit = new RelaySpeedLimit() };

View File

@@ -20,7 +20,7 @@ namespace linker.messenger.relay.server.validator
return $"SecretKey validate fail"; return $"SecretKey validate fail";
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
} }

View File

@@ -51,7 +51,7 @@ namespace linker.messenger.relay.server.validator
{ {
foreach (var item in validators) foreach (var item in validators)
{ {
string result = await item.Validate(relayInfo, cache, cache1); string result = await item.Validate(relayInfo, cache, cache1).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(result) == false) if (string.IsNullOrWhiteSpace(result) == false)
{ {
return result; return result;

View File

@@ -1,5 +1,6 @@
using linker.messenger.relay.client.transport; using linker.messenger.relay.client.transport;
using linker.messenger.relay.server; using linker.messenger.relay.server;
using linker.tunnel.connection;
using MemoryPack; using MemoryPack;
using System.Net; using System.Net;
using System.Xml.Linq; using System.Xml.Linq;
@@ -321,12 +322,17 @@ namespace linker.messenger.serializer.memorypack
[MemoryPackInclude] [MemoryPackInclude]
string Url => info.Url; string Url => info.Url;
[MemoryPackInclude]
bool AllowTcp => info.AllowTcp;
[MemoryPackInclude]
bool AllowUdp => info.AllowUdp;
[MemoryPackConstructor] [MemoryPackConstructor]
SerializableRelayServerNodeUpdateInfo( SerializableRelayServerNodeUpdateInfo(
string id, string name, string id, string name,
int maxConnection, double maxBandwidth, double maxBandwidthTotal, int maxConnection, double maxBandwidth, double maxBandwidthTotal,
double maxGbTotal, long maxGbTotalLastBytes, double maxGbTotal, long maxGbTotalLastBytes,
bool Public, string url) bool Public, string url, bool allowTcp, bool allowUdp)
{ {
var info = new RelayServerNodeUpdateInfo var info = new RelayServerNodeUpdateInfo
{ {
@@ -338,7 +344,9 @@ namespace linker.messenger.serializer.memorypack
MaxGbTotalLastBytes = maxGbTotalLastBytes, MaxGbTotalLastBytes = maxGbTotalLastBytes,
Name = name, Name = name,
Public = Public, Public = Public,
Url = url Url = url,
AllowTcp = allowTcp,
AllowUdp = allowUdp,
}; };
this.info = info; this.info = info;
} }
@@ -558,6 +566,9 @@ namespace linker.messenger.serializer.memorypack
[MemoryPackInclude] [MemoryPackInclude]
string Url => info.Url; string Url => info.Url;
[MemoryPackInclude]
TunnelProtocolType AllowProtocol => info.AllowProtocol;
[MemoryPackConstructor] [MemoryPackConstructor]
SerializableRelayServerNodeReportInfo170( SerializableRelayServerNodeReportInfo170(
@@ -566,7 +577,7 @@ namespace linker.messenger.serializer.memorypack
double maxGbTotal, long maxGbTotalLastBytes, double maxGbTotal, long maxGbTotalLastBytes,
double connectionRatio, double bandwidthRatio, double connectionRatio, double bandwidthRatio,
bool Public, int delay, bool Public, int delay,
IPEndPoint endPoint, long lastTicks, string url) IPEndPoint endPoint, long lastTicks, string url, TunnelProtocolType allowProtocol)
{ {
var info = new RelayServerNodeReportInfo170 var info = new RelayServerNodeReportInfo170
{ {
@@ -583,7 +594,8 @@ namespace linker.messenger.serializer.memorypack
MaxGbTotalLastBytes = maxGbTotalLastBytes, MaxGbTotalLastBytes = maxGbTotalLastBytes,
Name = name, Name = name,
Public = Public, Public = Public,
Url = url Url = url,
AllowProtocol = allowProtocol
}; };
this.info = info; this.info = info;
} }

View File

@@ -93,7 +93,7 @@ namespace linker.messenger.sforward.client
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)SForwardMessengerIds.GetForward, MessengerId = (ushort)SForwardMessengerIds.GetForward,
Payload = serializer.Serialize(param.Content) Payload = serializer.Serialize(param.Content)
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
return serializer.Deserialize<List<SForwardInfo>>(resp.Data.Span); return serializer.Deserialize<List<SForwardInfo>>(resp.Data.Span);
@@ -120,7 +120,7 @@ namespace linker.messenger.sforward.client
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)SForwardMessengerIds.AddClientForward, MessengerId = (ushort)SForwardMessengerIds.AddClientForward,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@@ -142,7 +142,7 @@ namespace linker.messenger.sforward.client
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)SForwardMessengerIds.RemoveClientForward, MessengerId = (ushort)SForwardMessengerIds.RemoveClientForward,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@@ -162,7 +162,7 @@ namespace linker.messenger.sforward.client
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)SForwardMessengerIds.TestClientForward, MessengerId = (ushort)SForwardMessengerIds.TestClientForward,
Payload = serializer.Serialize(param.Content) Payload = serializer.Serialize(param.Content)
}); }).ConfigureAwait(false);
return true; return true;
} }

View File

@@ -168,7 +168,7 @@ namespace linker.messenger.sforward.client
Socket socket = new Socket(info.LocalEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Socket socket = new Socket(info.LocalEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try try
{ {
await socket.ConnectAsync(info.LocalEP).WaitAsync(TimeSpan.FromMilliseconds(500)); await socket.ConnectAsync(info.LocalEP).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
sForwardClientStore.Update(info.Id, string.Empty); sForwardClientStore.Update(info.Id, string.Empty);
return true; return true;
} }

View File

@@ -57,7 +57,7 @@ namespace linker.plugins.sforward.messenger
try try
{ {
string error = await validator.Validate(cache, sForwardAddInfo); string error = await validator.Validate(cache, sForwardAddInfo).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(error) == false) if (string.IsNullOrWhiteSpace(error) == false)
{ {
result.Success = false; result.Success = false;
@@ -160,7 +160,7 @@ namespace linker.plugins.sforward.messenger
} }
try try
{ {
string error = await validator.Validate(cache, sForwardAddInfo); string error = await validator.Validate(cache, sForwardAddInfo).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(error) == false) if (string.IsNullOrWhiteSpace(error) == false)
{ {
result.Success = false; result.Success = false;
@@ -256,7 +256,7 @@ namespace linker.plugins.sforward.messenger
Connection = cacheTo.Connection, Connection = cacheTo.Connection,
MessengerId = (ushort)SForwardMessengerIds.AddClient, MessengerId = (ushort)SForwardMessengerIds.AddClient,
Payload = serializer.Serialize(info.Data) Payload = serializer.Serialize(info.Data)
}); }).ConfigureAwait(false);
} }
} }
/// <summary> /// <summary>
@@ -275,7 +275,7 @@ namespace linker.plugins.sforward.messenger
Connection = cacheTo.Connection, Connection = cacheTo.Connection,
MessengerId = (ushort)SForwardMessengerIds.RemoveClient, MessengerId = (ushort)SForwardMessengerIds.RemoveClient,
Payload = serializer.Serialize(info.Id) Payload = serializer.Serialize(info.Id)
}); }).ConfigureAwait(false);
} }
} }
@@ -294,7 +294,7 @@ namespace linker.plugins.sforward.messenger
{ {
Connection = cacheTo.Connection, Connection = cacheTo.Connection,
MessengerId = (ushort)SForwardMessengerIds.TestClientForward MessengerId = (ushort)SForwardMessengerIds.TestClientForward
}); }).ConfigureAwait(false);
} }
} }

View File

@@ -12,8 +12,8 @@ namespace linker.plugins.sforward.proxy
private ConcurrentDictionary<int, AsyncUserToken> tcpListens = new ConcurrentDictionary<int, AsyncUserToken>(); private ConcurrentDictionary<int, AsyncUserToken> tcpListens = new ConcurrentDictionary<int, AsyncUserToken>();
private ConcurrentDictionary<ulong, TaskCompletionSource<Socket>> tcpConnections = new ConcurrentDictionary<ulong, TaskCompletionSource<Socket>>(); private ConcurrentDictionary<ulong, TaskCompletionSource<Socket>> tcpConnections = new ConcurrentDictionary<ulong, TaskCompletionSource<Socket>>();
public Func<int, ulong, Task<bool>> TunnelConnect { get; set; } = async (port, id) => { return await Task.FromResult(false); }; public Func<int, ulong, Task<bool>> TunnelConnect { get; set; } = async (port, id) => { return await Task.FromResult(false).ConfigureAwait(false); };
public Func<string, int, ulong, Task<bool>> WebConnect { get; set; } = async (host, port, id) => { return await Task.FromResult(false); }; public Func<string, int, ulong, Task<bool>> WebConnect { get; set; } = async (host, port, id) => { return await Task.FromResult(false).ConfigureAwait(false); };
#region #region

View File

@@ -19,7 +19,7 @@ namespace linker.plugins.sforward.proxy
//本地服务表,其实不必要,只是缓存一下去定时检测过期没有 //本地服务表,其实不必要,只是缓存一下去定时检测过期没有
private ConcurrentDictionary<ulong, UdpConnectedCache> udpConnecteds = new ConcurrentDictionary<ulong, UdpConnectedCache>(); private ConcurrentDictionary<ulong, UdpConnectedCache> udpConnecteds = new ConcurrentDictionary<ulong, UdpConnectedCache>();
public Func<int, ulong, Task<bool>> UdpConnect { get; set; } = async (port, id) => { return await Task.FromResult(false); }; public Func<int, ulong, Task<bool>> UdpConnect { get; set; } = async (port, id) => { return await Task.FromResult(false).ConfigureAwait(false); };
#region #region

View File

@@ -29,7 +29,7 @@ namespace linker.messenger.sforward.server.validator
return $"sforward tunnel port range {string.Join("-", sForwardServerStore.TunnelPortRange)}"; return $"sforward tunnel port range {string.Join("-", sForwardServerStore.TunnelPortRange)}";
} }
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
} }

View File

@@ -48,7 +48,7 @@ namespace linker.messenger.sforward.server.validator
{ {
foreach (var item in validators) foreach (var item in validators)
{ {
string result = await item.Validate(signCacheInfo, sForwardAddInfo); string result = await item.Validate(signCacheInfo, sForwardAddInfo).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(result) == false) if (string.IsNullOrWhiteSpace(result) == false)
{ {
return result; return result;

View File

@@ -76,12 +76,12 @@ namespace linker.messenger.signin
try try
{ {
await clientSignInState.PushSignInBefore(); await clientSignInState.PushSignInBefore().ConfigureAwait(false);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Info($"connect to signin server:{signInClientStore.Server.Host}"); LoggerHelper.Instance.Info($"connect to signin server:{signInClientStore.Server.Host}");
IPEndPoint ip = await NetworkHelper.GetEndPointAsync(signInClientStore.Server.Host, 1802); IPEndPoint ip = await NetworkHelper.GetEndPointAsync(signInClientStore.Server.Host, 1802).ConfigureAwait(false);
if (ip == null) if (ip == null)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
@@ -136,7 +136,7 @@ namespace linker.messenger.signin
private async Task<bool> SignIn2Server() private async Task<bool> SignIn2Server()
{ {
Dictionary<string, string> args = []; Dictionary<string, string> args = [];
string argResult = await signInArgsTransfer.Invoke(signInClientStore.Server.Host, args); string argResult = await signInArgsTransfer.Invoke(signInClientStore.Server.Host, args).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(argResult) == false) if (string.IsNullOrWhiteSpace(argResult) == false)
{ {
LoggerHelper.Instance.Error(argResult); LoggerHelper.Instance.Error(argResult);
@@ -226,7 +226,7 @@ namespace linker.messenger.signin
MessengerId = (ushort)SignInMessengerIds.Online, MessengerId = (ushort)SignInMessengerIds.Online,
Payload = serializer.Serialize(machineId), Payload = serializer.Serialize(machineId),
Timeout = 3000 Timeout = 3000
}); }).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
} }
@@ -241,7 +241,7 @@ namespace linker.messenger.signin
Connection = clientSignInState.Connection, Connection = clientSignInState.Connection,
MessengerId = (ushort)SignInMessengerIds.NewId, MessengerId = (ushort)SignInMessengerIds.NewId,
Timeout = 3000 Timeout = 3000
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
return serializer.Deserialize<string>(resp.Data.Span); return serializer.Deserialize<string>(resp.Data.Span);

View File

@@ -63,7 +63,7 @@ namespace linker.messenger.signin
LoggerHelper.Instance.Info($"sign in from >=v131 {connection.Address}->{info.ToJson()}"); LoggerHelper.Instance.Info($"sign in from >=v131 {connection.Address}->{info.ToJson()}");
info.Connection = connection; info.Connection = connection;
string msg = await signCaching.Sign(info); string msg = await signCaching.Sign(info).ConfigureAwait(false);
SignInResponseInfo resp = new SignInResponseInfo SignInResponseInfo resp = new SignInResponseInfo
{ {

View File

@@ -47,7 +47,7 @@ namespace linker.messenger.signin
} }
//参数验证失败 //参数验证失败
string verifyResult = await signInArgsTransfer.Validate(signInfo, cache); string verifyResult = await signInArgsTransfer.Validate(signInfo, cache).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(verifyResult) == false) if (string.IsNullOrWhiteSpace(verifyResult) == false)
{ {
cache.Connected = false; cache.Connected = false;

View File

@@ -18,13 +18,13 @@
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {
args.TryAdd("signin-gpwd", signInClientStore.Group.Password); args.TryAdd("signin-gpwd", signInClientStore.Group.Password);
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache) public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
} }
@@ -40,7 +40,7 @@
} }
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
@@ -56,7 +56,7 @@
{ {
signInfo.GroupId = $"{signInfo.GroupId}->{gpwd}"; signInfo.GroupId = $"{signInfo.GroupId}->{gpwd}";
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }

View File

@@ -20,14 +20,14 @@ namespace linker.messenger.signin.args
args.TryAdd("machineKey", machineKey); args.TryAdd("machineKey", machineKey);
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache) public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
} }
@@ -40,7 +40,7 @@ namespace linker.messenger.signin.args
public string Name => "machineId"; public string Name => "machineId";
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
@@ -64,7 +64,7 @@ namespace linker.messenger.signin.args
return $"your id 【{signInfo.MachineId}】 is already online, online machineName {cache.MachineName}"; return $"your id 【{signInfo.MachineId}】 is already online, online machineName {cache.MachineName}";
} }
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }

View File

@@ -15,13 +15,13 @@
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {
args.TryAdd("signin-secretkey", signInClientStore.Server.SecretKey); args.TryAdd("signin-secretkey", signInClientStore.Server.SecretKey);
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache) public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
} }
@@ -39,7 +39,7 @@
} }
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
@@ -58,7 +58,7 @@
return $"server secretkey validate fail"; return $"server secretkey validate fail";
} }
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }

View File

@@ -44,7 +44,7 @@
{ {
foreach (var item in startups) foreach (var item in startups)
{ {
string result = await item.Invoke(host, args); string result = await item.Invoke(host, args).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(result) == false) if (string.IsNullOrWhiteSpace(result) == false)
{ {
return result; return result;
@@ -62,7 +62,7 @@
{ {
foreach (var item in startups) foreach (var item in startups)
{ {
string result = await item.Validate(signInfo, cache); string result = await item.Validate(signInfo, cache).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(result) == false) if (string.IsNullOrWhiteSpace(result) == false)
{ {
return result; return result;

View File

@@ -12,14 +12,14 @@ namespace linker.messenger.signin.args
{ {
args.TryAdd("version", VersionHelper.version); args.TryAdd("version", VersionHelper.version);
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache) public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
} }
@@ -38,7 +38,7 @@ namespace linker.messenger.signin.args
/// <returns></returns> /// <returns></returns>
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
@@ -55,7 +55,7 @@ namespace linker.messenger.signin.args
return "need v1.5.0+"; return "need v1.5.0+";
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }

View File

@@ -67,7 +67,7 @@ namespace linker.messenger.socks5
Socks5Info info = serializer.Deserialize<Socks5Info>(data.Span); Socks5Info info = serializer.Deserialize<Socks5Info>(data.Span);
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
await slim.WaitAsync(); await slim.WaitAsync().ConfigureAwait(false);
try try
{ {
socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info); socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info);
@@ -89,7 +89,7 @@ namespace linker.messenger.socks5
List<Socks5Info> list = data.Select(c => serializer.Deserialize<Socks5Info>(c.Span)).ToList(); List<Socks5Info> list = data.Select(c => serializer.Deserialize<Socks5Info>(c.Span)).ToList();
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
await slim.WaitAsync(); await slim.WaitAsync().ConfigureAwait(false);
try try
{ {

View File

@@ -91,7 +91,7 @@ namespace linker.messenger.socks5
/// <returns></returns> /// <returns></returns>
private async ValueTask<bool> ConnectTunnelConnection(AsyncUserToken token) private async ValueTask<bool> ConnectTunnelConnection(AsyncUserToken token)
{ {
int length = await token.Socket.ReceiveAsync(token.Buffer.AsMemory(), SocketFlags.None); int length = await token.Socket.ReceiveAsync(token.Buffer.AsMemory(), SocketFlags.None).ConfigureAwait(false);
if (length == 0) if (length == 0)
{ {
return true; return true;
@@ -102,7 +102,7 @@ namespace linker.messenger.socks5
//步骤request //步骤request
token.Proxy.Rsv = (byte)Socks5EnumStep.Request; token.Proxy.Rsv = (byte)Socks5EnumStep.Request;
if (await ReceiveCommandData(token) == false) if (await ReceiveCommandData(token).ConfigureAwait(false) == false)
{ {
return true; return true;
} }

View File

@@ -54,7 +54,7 @@ namespace linker.messenger.socks5
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error(ex); LoggerHelper.Instance.Error(ex);
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
/// <summary> /// <summary>
/// 根据不同的消息类型做不同的事情 /// 根据不同的消息类型做不同的事情

View File

@@ -110,7 +110,7 @@ namespace linker.messenger.store.file
client.Name = string.Empty; client.Name = string.Empty;
if (configExportInfo.Single || client.OnlyNode) if (configExportInfo.Single || client.OnlyNode)
{ {
client.Id = await signInClientTransfer.GetNewId(); client.Id = await signInClientTransfer.GetNewId().ConfigureAwait(false);
client.Name = configExportInfo.Name; client.Name = configExportInfo.Name;
} }
if (client.OnlyNode == false) if (client.OnlyNode == false)

View File

@@ -40,15 +40,15 @@ namespace linker.messenger.store.file.relay
{ {
liteCollection.Update(info); liteCollection.Update(info);
} }
return await Task.FromResult(true); return await Task.FromResult(true).ConfigureAwait(false);
} }
public async Task<bool> Del(int id) public async Task<bool> Del(int id)
{ {
return await Task.FromResult(liteCollection.UpdateMany(c => new RelayServerCdkeyStoreInfo { Deleted = true }, c => c.Id == id) > 0); return await Task.FromResult(liteCollection.UpdateMany(c => new RelayServerCdkeyStoreInfo { Deleted = true }, c => c.Id == id) > 0).ConfigureAwait(false);
} }
public async Task<bool> Del(int id, string userid) public async Task<bool> Del(int id, string userid)
{ {
return await Task.FromResult(liteCollection.UpdateMany(c => new RelayServerCdkeyStoreInfo { Deleted = true }, c => c.Id == id && c.UserId == userid) > 0); return await Task.FromResult(liteCollection.UpdateMany(c => new RelayServerCdkeyStoreInfo { Deleted = true }, c => c.Id == id && c.UserId == userid) > 0).ConfigureAwait(false);
} }
public async Task<RelayServerCdkeyTestResultInfo> Test(RelayServerCdkeyImportInfo info) public async Task<RelayServerCdkeyTestResultInfo> Test(RelayServerCdkeyImportInfo info)
@@ -102,11 +102,11 @@ namespace linker.messenger.store.file.relay
} }
result.Field = error; result.Field = error;
return await Task.FromResult(result); return await Task.FromResult(result).ConfigureAwait(false);
} }
public async Task<string> Import(RelayServerCdkeyImportInfo info) public async Task<string> Import(RelayServerCdkeyImportInfo info)
{ {
RelayServerCdkeyTestResultInfo test = await Test(info); RelayServerCdkeyTestResultInfo test = await Test(info).ConfigureAwait(false);
if (test.Field.Count > 0) if (test.Field.Count > 0)
{ {
@@ -151,7 +151,7 @@ namespace linker.messenger.store.file.relay
UserPrice = order.UserPrice UserPrice = order.UserPrice
}; };
liteCollection.Insert(store); liteCollection.Insert(store);
return await Task.FromResult(string.Empty); return await Task.FromResult(string.Empty).ConfigureAwait(false);
} }
public async Task<bool> Traffic(Dictionary<int, long> dic) public async Task<bool> Traffic(Dictionary<int, long> dic)
@@ -165,20 +165,20 @@ namespace linker.messenger.store.file.relay
liteCollection.UpdateMany(x => new RelayServerCdkeyStoreInfo { LastBytes = bytes, UseTime = DateTime.Now }, c => c.Id == item.Key); liteCollection.UpdateMany(x => new RelayServerCdkeyStoreInfo { LastBytes = bytes, UseTime = DateTime.Now }, c => c.Id == item.Key);
} }
} }
return await Task.FromResult(true); return await Task.FromResult(true).ConfigureAwait(false);
} }
public async Task<Dictionary<int, long>> GetLastBytes(List<int> ids) public async Task<Dictionary<int, long>> GetLastBytes(List<int> ids)
{ {
return await Task.FromResult(liteCollection.Find(c => ids.Contains(c.Id)).ToDictionary(c => c.Id, c => c.LastBytes)); return await Task.FromResult(liteCollection.Find(c => ids.Contains(c.Id)).ToDictionary(c => c.Id, c => c.LastBytes)).ConfigureAwait(false);
} }
public async Task<List<RelayServerCdkeyStoreInfo>> GetAvailable(string userid) public async Task<List<RelayServerCdkeyStoreInfo>> GetAvailable(string userid)
{ {
return await Task.FromResult(liteCollection.Find(x => x.UserId == userid && x.LastBytes > 0 && x.StartTime <= DateTime.Now && x.EndTime >= DateTime.Now && x.Deleted == false).ToList()); return await Task.FromResult(liteCollection.Find(x => x.UserId == userid && x.LastBytes > 0 && x.StartTime <= DateTime.Now && x.EndTime >= DateTime.Now && x.Deleted == false).ToList()).ConfigureAwait(false);
} }
public async Task<List<RelayServerCdkeyStoreInfo>> Get(List<int> ids) public async Task<List<RelayServerCdkeyStoreInfo>> Get(List<int> ids)
{ {
return await Task.FromResult(liteCollection.Find(x => ids.Contains(x.Id)).ToList()); return await Task.FromResult(liteCollection.Find(x => ids.Contains(x.Id)).ToList()).ConfigureAwait(false);
} }
public async Task<RelayServerCdkeyPageResultInfo> Page(RelayServerCdkeyPageRequestInfo info) public async Task<RelayServerCdkeyPageResultInfo> Page(RelayServerCdkeyPageRequestInfo info)
@@ -241,7 +241,7 @@ namespace linker.messenger.store.file.relay
Size = info.Size, Size = info.Size,
Count = query.Count(), Count = query.Count(),
List = query.Skip((info.Page - 1) * info.Size).Limit(info.Size).ToList() List = query.Skip((info.Page - 1) * info.Size).Limit(info.Size).ToList()
}); }).ConfigureAwait(false);
} }

View File

@@ -32,6 +32,8 @@ namespace linker.messenger.store.file.relay
config.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes = update.MaxGbTotalLastBytes; config.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes = update.MaxGbTotalLastBytes;
config.Data.Server.Relay.Distributed.Node.Public = update.Public; config.Data.Server.Relay.Distributed.Node.Public = update.Public;
config.Data.Server.Relay.Distributed.Node.Url = update.Url; config.Data.Server.Relay.Distributed.Node.Url = update.Url;
config.Data.Server.Relay.Distributed.Node.AllowTcp = update.AllowTcp;
config.Data.Server.Relay.Distributed.Node.AllowUdp = update.AllowUdp;
} }
public void SetMaxGbTotalLastBytes(long value) public void SetMaxGbTotalLastBytes(long value)

View File

@@ -32,12 +32,12 @@ namespace linker.messenger.store.file.tunnel
OnChanged(); OnChanged();
return await Task.FromResult(true); return await Task.FromResult(true).ConfigureAwait(false);
} }
public async Task<List<TunnelTransportItemInfo>> GetTunnelTransports() public async Task<List<TunnelTransportItemInfo>> GetTunnelTransports()
{ {
return await Task.FromResult(config.Data.Client.Tunnel.Transports); return await Task.FromResult(config.Data.Client.Tunnel.Transports).ConfigureAwait(false);
} }
public async Task<bool> SetRouteLevelPlus(int level) public async Task<bool> SetRouteLevelPlus(int level)
@@ -45,7 +45,7 @@ namespace linker.messenger.store.file.tunnel
runningConfig.Data.Tunnel.RouteLevelPlus = level; runningConfig.Data.Tunnel.RouteLevelPlus = level;
runningConfig.Data.Update(); runningConfig.Data.Update();
OnChanged(); OnChanged();
return await Task.FromResult(true); return await Task.FromResult(true).ConfigureAwait(false);
} }
public async Task<bool> SetPortMap(int privatePort, int publicPort) public async Task<bool> SetPortMap(int privatePort, int publicPort)
@@ -54,7 +54,7 @@ namespace linker.messenger.store.file.tunnel
runningConfig.Data.Tunnel.PortMapWan = publicPort; runningConfig.Data.Tunnel.PortMapWan = publicPort;
runningConfig.Data.Update(); runningConfig.Data.Update();
OnChanged(); OnChanged();
return await Task.FromResult(true); return await Task.FromResult(true).ConfigureAwait(false);
} }
} }
} }

View File

@@ -23,7 +23,7 @@ namespace linker.messenger.sync
string[] names = param.Content.DeJson<string[]>(); string[] names = param.Content.DeJson<string[]>();
if (names.Length == 1) if (names.Length == 1)
{ {
await syncTreansfer.Sync(names[0]); await syncTreansfer.Sync(names[0]).ConfigureAwait(false);
} }
else else
{ {

View File

@@ -36,7 +36,7 @@ namespace linker.messenger.sync
})); }));
} }
await Task.WhenAll(tasks); await Task.WhenAll(tasks).ConfigureAwait(false);
} }
} }
} }

View File

@@ -33,7 +33,7 @@ namespace linker.messenger.sync
{ {
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
await slim.WaitAsync(); await slim.WaitAsync().ConfigureAwait(false);
try try
{ {
var tasks = syncs.Where(c => names.Contains(c.Name)).Select(c => var tasks = syncs.Where(c => names.Contains(c.Name)).Select(c =>
@@ -46,7 +46,7 @@ namespace linker.messenger.sync
}); });
}).ToList(); }).ToList();
await Task.WhenAll(tasks); await Task.WhenAll(tasks).ConfigureAwait(false);
} }
catch (Exception) catch (Exception)
{ {
@@ -64,7 +64,7 @@ namespace linker.messenger.sync
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)ConfigMessengerIds.SyncForward, MessengerId = (ushort)ConfigMessengerIds.SyncForward,
Payload = serializer.Serialize(new SyncInfo { Name = sync.Name, Data = sync.GetData() }), Payload = serializer.Serialize(new SyncInfo { Name = sync.Name, Data = sync.GetData() }),
}); }).ConfigureAwait(false);
} }
} }
public void Sync(SyncInfo info) public void Sync(SyncInfo info)

View File

@@ -16,14 +16,14 @@ namespace linker.messenger.tunnel
{ {
args.TryAdd("tunnelNet", new SignInArgsNetInfo { Lat = tunnelNetworkTransfer.Info.Net.Lat, Lon = tunnelNetworkTransfer.Info.Net.Lon, City = tunnelNetworkTransfer.Info.Net.City }.ToJson()); args.TryAdd("tunnelNet", new SignInArgsNetInfo { Lat = tunnelNetworkTransfer.Info.Net.Lat, Lon = tunnelNetworkTransfer.Info.Net.Lon, City = tunnelNetworkTransfer.Info.Net.City }.ToJson());
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache) public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
return string.Empty; return string.Empty;
} }
} }

View File

@@ -69,8 +69,8 @@ namespace linker.messenger.tunnel
if (tunnelSetRouteLevelInfo.MachineId == signInClientStore.Id) if (tunnelSetRouteLevelInfo.MachineId == signInClientStore.Id)
{ {
await tunnelClientStore.SetRouteLevelPlus(tunnelSetRouteLevelInfo.RouteLevelPlus); await tunnelClientStore.SetRouteLevelPlus(tunnelSetRouteLevelInfo.RouteLevelPlus).ConfigureAwait(false);
await tunnelClientStore.SetPortMap(tunnelSetRouteLevelInfo.PortMapLan, tunnelSetRouteLevelInfo.PortMapWan); await tunnelClientStore.SetPortMap(tunnelSetRouteLevelInfo.PortMapLan, tunnelSetRouteLevelInfo.PortMapWan).ConfigureAwait(false);
} }
else else
{ {
@@ -91,7 +91,7 @@ namespace linker.messenger.tunnel
/// <returns></returns> /// <returns></returns>
public async Task<List<TunnelTransportItemInfo>> GetTransports(ApiControllerParamsInfo param) public async Task<List<TunnelTransportItemInfo>> GetTransports(ApiControllerParamsInfo param)
{ {
return await tunnelClientStore.GetTunnelTransports(); return await tunnelClientStore.GetTunnelTransports().ConfigureAwait(false);
} }
/// <summary> /// <summary>
/// 设置打洞协议 /// 设置打洞协议
@@ -102,7 +102,7 @@ namespace linker.messenger.tunnel
public async Task<bool> SetTransports(ApiControllerParamsInfo param) public async Task<bool> SetTransports(ApiControllerParamsInfo param)
{ {
List<TunnelTransportItemInfo> info = param.Content.DeJson<List<TunnelTransportItemInfo>>(); List<TunnelTransportItemInfo> info = param.Content.DeJson<List<TunnelTransportItemInfo>>();
await tunnelClientStore.SetTunnelTransports(info); await tunnelClientStore.SetTunnelTransports(info).ConfigureAwait(false);
return true; return true;
} }

View File

@@ -94,12 +94,12 @@ namespace linker.plugins.tunnel
public async Task<List<TunnelTransportItemInfo>> GetTunnelTransports() public async Task<List<TunnelTransportItemInfo>> GetTunnelTransports()
{ {
return await tunnelClientStore.GetTunnelTransports(); return await tunnelClientStore.GetTunnelTransports().ConfigureAwait(false);
} }
public async Task<bool> SetTunnelTransports(List<TunnelTransportItemInfo> list) public async Task<bool> SetTunnelTransports(List<TunnelTransportItemInfo> list)
{ {
return await tunnelClientStore.SetTunnelTransports(list); return await tunnelClientStore.SetTunnelTransports(list).ConfigureAwait(false);
} }
public async Task<TunnelTransportWanPortInfo> GetRemoteWanPort(TunnelWanPortProtocolInfo info) public async Task<TunnelTransportWanPortInfo> GetRemoteWanPort(TunnelWanPortProtocolInfo info)

View File

@@ -52,7 +52,7 @@ namespace linker.messenger.tunnel
Code = MessageResponeCodes.ERROR, Code = MessageResponeCodes.ERROR,
Payload = Helper.EmptyArray, Payload = Helper.EmptyArray,
RequestId = requestid RequestId = requestid
}, (ushort)TunnelMessengerIds.Info); }, (ushort)TunnelMessengerIds.Info).ConfigureAwait(false);
} }
else else
{ {
@@ -62,7 +62,7 @@ namespace linker.messenger.tunnel
Code = MessageResponeCodes.OK, Code = MessageResponeCodes.OK,
Payload = serializer.Serialize(result.Result), Payload = serializer.Serialize(result.Result),
RequestId = requestid RequestId = requestid
}, (ushort)TunnelMessengerIds.Info); }, (ushort)TunnelMessengerIds.Info).ConfigureAwait(false);
} }
}); });
} }
@@ -94,8 +94,8 @@ namespace linker.messenger.tunnel
public async Task RouteLevel(IConnection connection) public async Task RouteLevel(IConnection connection)
{ {
TunnelSetRouteLevelInfo tunnelTransportFileConfigInfo = serializer.Deserialize<TunnelSetRouteLevelInfo>(connection.ReceiveRequestWrap.Payload.Span); TunnelSetRouteLevelInfo tunnelTransportFileConfigInfo = serializer.Deserialize<TunnelSetRouteLevelInfo>(connection.ReceiveRequestWrap.Payload.Span);
await tunnelClientStore.SetRouteLevelPlus(tunnelTransportFileConfigInfo.RouteLevelPlus); await tunnelClientStore.SetRouteLevelPlus(tunnelTransportFileConfigInfo.RouteLevelPlus).ConfigureAwait(false);
await tunnelClientStore.SetPortMap(tunnelTransportFileConfigInfo.PortMapLan, tunnelTransportFileConfigInfo.PortMapWan); await tunnelClientStore.SetPortMap(tunnelTransportFileConfigInfo.PortMapLan, tunnelTransportFileConfigInfo.PortMapWan).ConfigureAwait(false);
} }
} }

View File

@@ -51,7 +51,7 @@ namespace linker.messenger.tunnel
try try
{ {
using HttpClient httpClient = new HttpClient(); using HttpClient httpClient = new HttpClient();
string str = await httpClient.GetStringAsync($"http://ip-api.com/json").WaitAsync(TimeSpan.FromMilliseconds(3000)); string str = await httpClient.GetStringAsync($"http://ip-api.com/json").WaitAsync(TimeSpan.FromMilliseconds(3000)).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(str) == false) if (string.IsNullOrWhiteSpace(str) == false)
{ {
@@ -75,7 +75,7 @@ namespace linker.messenger.tunnel
try try
{ {
using HttpClient httpClient = new HttpClient(); using HttpClient httpClient = new HttpClient();
string str = await httpClient.GetStringAsync($"https://api.myip.la/en?json").WaitAsync(TimeSpan.FromMilliseconds(5000)); string str = await httpClient.GetStringAsync($"https://api.myip.la/en?json").WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(str) == false) if (string.IsNullOrWhiteSpace(str) == false)
{ {
@@ -94,7 +94,7 @@ namespace linker.messenger.tunnel
{ {
if (string.IsNullOrWhiteSpace(Info.Net.City)) if (string.IsNullOrWhiteSpace(Info.Net.City))
{ {
await Task.WhenAll(GetIsp(), GetPosition()); await Task.WhenAll(GetIsp(), GetPosition()).ConfigureAwait(false);
} }
} }

View File

@@ -4,7 +4,6 @@ using linker.messenger.exroute;
using linker.messenger.signin; using linker.messenger.signin;
using linker.tun; using linker.tun;
using linker.tunnel.connection; using linker.tunnel.connection;
using System.Diagnostics;
namespace linker.messenger.tuntap namespace linker.messenger.tuntap
{ {
@@ -12,6 +11,8 @@ namespace linker.messenger.tuntap
{ {
private List<LinkerTunDeviceForwardItem> forwardItems = new List<LinkerTunDeviceForwardItem>(); private List<LinkerTunDeviceForwardItem> forwardItems = new List<LinkerTunDeviceForwardItem>();
private bool skipCheck => tuntapTransfer.Status == TuntapStatus.Operating || tuntapConfigTransfer.Running == false;
private bool needRestart => tuntapTransfer.Status != TuntapStatus.Running || tuntapConfigTransfer.Changed;
private readonly TuntapTransfer tuntapTransfer; private readonly TuntapTransfer tuntapTransfer;
private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly TuntapConfigTransfer tuntapConfigTransfer;
@@ -76,37 +77,31 @@ namespace linker.messenger.tuntap
} }
private ulong configVersion = 0;
private OperatingManager checking = new OperatingManager(); private OperatingManager checking = new OperatingManager();
private void CheckDeviceTask() private void CheckDeviceTask()
{ {
TimerHelper.SetIntervalLong(async () => TimerHelper.SetIntervalLong(async () =>
{ {
await CheckDevice(); await CheckDevice().ConfigureAwait(false);
return true; return true;
}, 30000); }, 5000);
} }
private async Task CheckDevice() private async Task CheckDevice()
{ {
try try
{ {
bool start = checking.StartOperation(); if (checking.StartOperation() == false || skipCheck)
//开始操作失败,或者网卡正在操作中,或者不需要运行
if (start == false || tuntapTransfer.Status == TuntapStatus.Operating || tuntapConfigTransfer.Running == false)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Warning($"tuntap check device continue :start:{start},status:{tuntapTransfer.Status},running:{tuntapConfigTransfer.Running}");
return; return;
} }
if (needRestart)
//配置发生变化,或者网卡不可用
if (tuntapConfigTransfer.Version.Eq(configVersion, out ulong version) == false || tuntapTransfer.Status != TuntapStatus.Running || await tuntapTransfer.CheckAvailable() == false)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) await RetstartDevice().ConfigureAwait(false);
LoggerHelper.Instance.Warning($"tuntap config version changed, restarting device"); return;
configVersion = version; }
await RetstartDevice(); if (await tuntapTransfer.CheckAvailable().ConfigureAwait(false) == false)
{
tuntapTransfer.Refresh();
} }
} }
catch (Exception) catch (Exception)
@@ -127,13 +122,13 @@ namespace linker.messenger.tuntap
return; return;
} }
} }
await tuntapProxy.InputPacket(packet); await tuntapProxy.InputPacket(packet).ConfigureAwait(false);
} }
public async ValueTask Close(ITunnelConnection connection) public async ValueTask Close(ITunnelConnection connection)
{ {
tuntapDecenter.Refresh(); tuntapDecenter.Refresh();
await ValueTask.CompletedTask; await ValueTask.CompletedTask.ConfigureAwait(false);
} }
public void Receive(ITunnelConnection connection, ReadOnlyMemory<byte> buffer) public void Receive(ITunnelConnection connection, ReadOnlyMemory<byte> buffer)
{ {
@@ -142,7 +137,7 @@ namespace linker.messenger.tuntap
public async ValueTask NotFound(uint ip) public async ValueTask NotFound(uint ip)
{ {
tuntapDecenter.Refresh(); tuntapDecenter.Refresh();
await ValueTask.CompletedTask; await ValueTask.CompletedTask.ConfigureAwait(false);
} }
/// <summary> /// <summary>
@@ -154,7 +149,7 @@ namespace linker.messenger.tuntap
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Warning($"restart, stop device"); LoggerHelper.Instance.Warning($"restart, stop device");
tuntapTransfer.Shutdown(); tuntapTransfer.Shutdown();
await tuntapConfigTransfer.RefreshIPASync(); await tuntapConfigTransfer.RefreshIPASync().ConfigureAwait(false);
tuntapTransfer.Setup(tuntapConfigTransfer.Name, tuntapConfigTransfer.Info.IP, tuntapConfigTransfer.Info.PrefixLength, tuntapConfigTransfer.Info.DisableNat == false); tuntapTransfer.Setup(tuntapConfigTransfer.Name, tuntapConfigTransfer.Info.IP, tuntapConfigTransfer.Info.PrefixLength, tuntapConfigTransfer.Info.DisableNat == false);
} }
/// <summary> /// <summary>

View File

@@ -104,7 +104,7 @@ namespace linker.messenger.tuntap
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Warning($"api restarting device"); LoggerHelper.Instance.Warning($"api restarting device");
await tuntapAdapter.RetstartDevice(); await tuntapAdapter.RetstartDevice().ConfigureAwait(false);
} }
else else
{ {
@@ -209,8 +209,8 @@ namespace linker.messenger.tuntap
[Access(AccessValue.Lease)] [Access(AccessValue.Lease)]
public async Task AddNetwork(ApiControllerParamsInfo param) public async Task AddNetwork(ApiControllerParamsInfo param)
{ {
await leaseClientTreansfer.AddNetwork(param.Content.DeJson<LeaseInfo>()); await leaseClientTreansfer.AddNetwork(param.Content.DeJson<LeaseInfo>()).ConfigureAwait(false);
await leaseClientTreansfer.LeaseChange(); await leaseClientTreansfer.LeaseChange().ConfigureAwait(false);
tuntapConfigTransfer.RefreshIP(); tuntapConfigTransfer.RefreshIP();
} }
/// <summary> /// <summary>
@@ -220,7 +220,7 @@ namespace linker.messenger.tuntap
/// <returns></returns> /// <returns></returns>
public async Task<LeaseInfo> GetNetwork(ApiControllerParamsInfo param) public async Task<LeaseInfo> GetNetwork(ApiControllerParamsInfo param)
{ {
return await leaseClientTreansfer.GetNetwork(); return await leaseClientTreansfer.GetNetwork().ConfigureAwait(false);
} }
/// <summary> /// <summary>
@@ -242,7 +242,7 @@ namespace linker.messenger.tuntap
if (tuntapForwardTestWrapInfo.MachineId == signInClientStore.Id) if (tuntapForwardTestWrapInfo.MachineId == signInClientStore.Id)
{ {
await pingTransfer.SubscribeForwardTest(tuntapForwardTestWrapInfo.List); await pingTransfer.SubscribeForwardTest(tuntapForwardTestWrapInfo.List).ConfigureAwait(false);
} }
else else
{ {

View File

@@ -16,6 +16,18 @@ namespace linker.messenger.tuntap
private string name = string.Empty; private string name = string.Empty;
public string Name => string.IsNullOrWhiteSpace(Info.Name) ? (string.IsNullOrWhiteSpace(name) ? "linker" : name) : Info.Name; public string Name => string.IsNullOrWhiteSpace(Info.Name) ? (string.IsNullOrWhiteSpace(name) ? "linker" : name) : Info.Name;
private ulong configVersion = 0;
public bool Changed
{
get
{
bool result = Version.Eq(configVersion, out ulong version);
configVersion = version;
return result == false;
}
}
public VersionManager Version { get; } = new VersionManager(); public VersionManager Version { get; } = new VersionManager();
private readonly ITuntapClientStore tuntapStore; private readonly ITuntapClientStore tuntapStore;
@@ -65,7 +77,7 @@ namespace linker.messenger.tuntap
Info.Forwards = info.Forwards; Info.Forwards = info.Forwards;
tuntapStore.Confirm(); tuntapStore.Confirm();
await LeaseIP(); await LeaseIP().ConfigureAwait(false);
SetGroupIP(); SetGroupIP();
if (ip.Equals(Info.IP) == false || prefixLength != Info.PrefixLength || string.Equals(name, Info.Name) == false) if (ip.Equals(Info.IP) == false || prefixLength != Info.PrefixLength || string.Equals(name, Info.Name) == false)
@@ -93,7 +105,7 @@ namespace linker.messenger.tuntap
byte prefixLength = Info.PrefixLength; byte prefixLength = Info.PrefixLength;
LoadGroupIP(); LoadGroupIP();
await LeaseIP(); await LeaseIP().ConfigureAwait(false);
SetGroupIP(); SetGroupIP();
if ((oldIP.Equals(Info.IP) == false || prefixLength != Info.PrefixLength) && Info.Running) if ((oldIP.Equals(Info.IP) == false || prefixLength != Info.PrefixLength) && Info.Running)
@@ -105,7 +117,7 @@ namespace linker.messenger.tuntap
} }
private async Task LeaseIP() private async Task LeaseIP()
{ {
LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(Info.IP, Info.PrefixLength); LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(Info.IP, Info.PrefixLength).ConfigureAwait(false);
Info.IP = leaseInfo.IP; Info.IP = leaseInfo.IP;
Info.PrefixLength = leaseInfo.PrefixLength; Info.PrefixLength = leaseInfo.PrefixLength;
name = leaseInfo.Name; name = leaseInfo.Name;

View File

@@ -12,7 +12,6 @@ namespace linker.messenger.tuntap
{ {
public string Name => "tuntap"; public string Name => "tuntap";
public VersionManager SyncVersion { get; } = new VersionManager(); public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager(); public VersionManager DataVersion { get; } = new VersionManager();
public ConcurrentDictionary<string, TuntapInfo> Infos => tuntapInfos; public ConcurrentDictionary<string, TuntapInfo> Infos => tuntapInfos;
public LinkerTunDeviceRouteItem[] Routes => routeItems; public LinkerTunDeviceRouteItem[] Routes => routeItems;
@@ -95,7 +94,7 @@ namespace linker.messenger.tuntap
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
await slim.WaitAsync(); await slim.WaitAsync().ConfigureAwait(false);
try try
{ {
tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info);
@@ -117,7 +116,7 @@ namespace linker.messenger.tuntap
List<TuntapInfo> list = data.Select(c => serializer.Deserialize<TuntapInfo>(c.Span)).ToList(); List<TuntapInfo> list = data.Select(c => serializer.Deserialize<TuntapInfo>(c.Span)).ToList();
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
await slim.WaitAsync(); await slim.WaitAsync().ConfigureAwait(false);
try try
{ {

View File

@@ -25,7 +25,6 @@ namespace linker.messenger.tuntap
this.tuntapDecenter = tuntapDecenter; this.tuntapDecenter = tuntapDecenter;
PingTask(); PingTask();
} }
private readonly LastTicksManager lastTicksManager = new LastTicksManager(); private readonly LastTicksManager lastTicksManager = new LastTicksManager();
@@ -39,14 +38,14 @@ namespace linker.messenger.tuntap
{ {
if (tuntapTransfer.Status == TuntapStatus.Running) if (tuntapTransfer.Status == TuntapStatus.Running)
{ {
await Ping(); await Ping().ConfigureAwait(false);
} }
return true; return true;
}, () => tuntapTransfer.Status == TuntapStatus.Running && lastTicksManager.DiffLessEqual(5000) ? 3000 : 30000); }, () => tuntapTransfer.Status == TuntapStatus.Running && lastTicksManager.DiffLessEqual(5000) ? 3000 : 30000);
} }
private async Task Ping() private async Task Ping()
{ {
if (tuntapTransfer.Status == TuntapStatus.Running && (tuntapConfigTransfer.Switch & TuntapSwitch.ShowDelay) == TuntapSwitch.ShowDelay) if (tuntapTransfer.Status == TuntapStatus.Running && tuntapConfigTransfer.Switch.HasFlag(TuntapSwitch.ShowDelay))
{ {
var items = tuntapDecenter.Infos.Values.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false && (c.Status & TuntapStatus.Running) == TuntapStatus.Running); var items = tuntapDecenter.Infos.Values.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false && (c.Status & TuntapStatus.Running) == TuntapStatus.Running);
if ((tuntapConfigTransfer.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect) if ((tuntapConfigTransfer.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect)
@@ -58,10 +57,10 @@ namespace linker.messenger.tuntap
await Task.WhenAll(items.Select(async c => await Task.WhenAll(items.Select(async c =>
{ {
using Ping ping = new Ping(); using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(c.IP, 500); PingReply pingReply = await ping.SendPingAsync(c.IP, 500).ConfigureAwait(false);
c.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1; c.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1;
tuntapDecenter.DataVersion.Add(); tuntapDecenter.DataVersion.Add();
})); })).ConfigureAwait(false);
} }
} }
@@ -72,7 +71,7 @@ namespace linker.messenger.tuntap
try try
{ {
var socket = new Socket(c.ConnectAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); var socket = new Socket(c.ConnectAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
await socket.ConnectAsync(new IPEndPoint(c.ConnectAddr, c.ConnectPort)).WaitAsync(TimeSpan.FromMilliseconds(500)); await socket.ConnectAsync(new IPEndPoint(c.ConnectAddr, c.ConnectPort)).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
socket.SafeClose(); socket.SafeClose();
c.Error = string.Empty; c.Error = string.Empty;
} }
@@ -80,7 +79,7 @@ namespace linker.messenger.tuntap
{ {
c.Error = ex.Message; c.Error = ex.Message;
} }
})); })).ConfigureAwait(false);
} }
} }
} }

View File

@@ -112,7 +112,7 @@ namespace linker.messenger.tuntap
}, ip); }, ip);
return; return;
} }
await connection.SendAsync(packet.Packet); await connection.SendAsync(packet.Packet).ConfigureAwait(false);
} }
/// <summary> /// <summary>

View File

@@ -35,6 +35,7 @@ namespace linker.messenger.tuntap
AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown(); AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown();
Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown(); Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown();
} }
public bool Write(ReadOnlyMemory<byte> buffer) public bool Write(ReadOnlyMemory<byte> buffer)
{ {
return linkerTunDeviceAdapter.Write(buffer); return linkerTunDeviceAdapter.Write(buffer);
@@ -88,6 +89,35 @@ namespace linker.messenger.tuntap
}); });
} }
/// <summary>
/// 刷新网卡
/// </summary>
public void Refresh()
{
if (operatingManager.StartOperation() == false)
{
return;
}
TimerHelper.Async(() =>
{
try
{
linkerTunDeviceAdapter.Refresh();
}
catch (Exception ex)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
}
}
finally
{
operatingManager.StopOperation();
}
});
}
/// <summary> /// <summary>
/// 停止网卡 /// 停止网卡
/// </summary> /// </summary>
@@ -137,7 +167,7 @@ namespace linker.messenger.tuntap
} }
public async Task<bool> CheckAvailable() public async Task<bool> CheckAvailable()
{ {
return await linkerTunDeviceAdapter.CheckAvailable(); return await linkerTunDeviceAdapter.CheckAvailable().ConfigureAwait(false);
} }
} }
} }

View File

@@ -25,7 +25,7 @@ namespace linker.messenger.tuntap.lease
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)TuntapMessengerIds.LeaseAddNetwork, MessengerId = (ushort)TuntapMessengerIds.LeaseAddNetwork,
Payload = serializer.Serialize(info) Payload = serializer.Serialize(info)
}); }).ConfigureAwait(false);
} }
public async Task<LeaseInfo> GetNetwork() public async Task<LeaseInfo> GetNetwork()
{ {
@@ -34,7 +34,7 @@ namespace linker.messenger.tuntap.lease
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)TuntapMessengerIds.LeaseGetNetwork MessengerId = (ushort)TuntapMessengerIds.LeaseGetNetwork
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
LeaseInfo info = serializer.Deserialize<LeaseInfo>(resp.Data.Span); LeaseInfo info = serializer.Deserialize<LeaseInfo>(resp.Data.Span);
@@ -48,7 +48,7 @@ namespace linker.messenger.tuntap.lease
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)TuntapMessengerIds.LeaseChangeForward MessengerId = (ushort)TuntapMessengerIds.LeaseChangeForward
}); }).ConfigureAwait(false);
} }
public async Task<LeaseInfo> LeaseIp(IPAddress ip, byte prefixLength) public async Task<LeaseInfo> LeaseIp(IPAddress ip, byte prefixLength)
@@ -59,7 +59,7 @@ namespace linker.messenger.tuntap.lease
MessengerId = (ushort)TuntapMessengerIds.LeaseIP, MessengerId = (ushort)TuntapMessengerIds.LeaseIP,
Payload = serializer.Serialize(new LeaseInfo { IP = ip, PrefixLength = prefixLength }) Payload = serializer.Serialize(new LeaseInfo { IP = ip, PrefixLength = prefixLength })
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK) if (resp.Code == MessageResponeCodes.OK)
{ {
LeaseInfo newip = serializer.Deserialize<LeaseInfo>(resp.Data.Span); LeaseInfo newip = serializer.Deserialize<LeaseInfo>(resp.Data.Span);
@@ -79,7 +79,7 @@ namespace linker.messenger.tuntap.lease
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)TuntapMessengerIds.LeaseExp, MessengerId = (ushort)TuntapMessengerIds.LeaseExp,
}); }).ConfigureAwait(false);
return true; return true;
}, 60000); }, 60000);

View File

@@ -47,7 +47,7 @@ namespace linker.messenger.updater
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.UpdateServer, MessengerId = (ushort)UpdaterMessengerIds.UpdateServer,
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
return serializer.Deserialize<UpdaterInfo>(resp.Data.Span); return serializer.Deserialize<UpdaterInfo>(resp.Data.Span);
@@ -61,7 +61,7 @@ namespace linker.messenger.updater
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.ConfirmServer, MessengerId = (ushort)UpdaterMessengerIds.ConfirmServer,
Payload = serializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterClientStore.SecretKey, Version = param.Content }) Payload = serializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterClientStore.SecretKey, Version = param.Content })
}); }).ConfigureAwait(false);
} }
public async Task ExitServer(ApiControllerParamsInfo param) public async Task ExitServer(ApiControllerParamsInfo param)
{ {
@@ -70,7 +70,7 @@ namespace linker.messenger.updater
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.ExitServer, MessengerId = (ushort)UpdaterMessengerIds.ExitServer,
Payload = serializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterClientStore.SecretKey, Version = string.Empty }) Payload = serializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterClientStore.SecretKey, Version = string.Empty })
}); }).ConfigureAwait(false);
} }
public UpdaterInfo GetCurrent(ApiControllerParamsInfo param) public UpdaterInfo GetCurrent(ApiControllerParamsInfo param)
@@ -108,7 +108,7 @@ namespace linker.messenger.updater
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.ConfirmForward, MessengerId = (ushort)UpdaterMessengerIds.ConfirmForward,
Payload = serializer.Serialize(confirm) Payload = serializer.Serialize(confirm)
}); }).ConfigureAwait(false);
if (resp.Code != MessageResponeCodes.OK || resp.Data.Span.SequenceEqual(Helper.TrueArray) == false) if (resp.Code != MessageResponeCodes.OK || resp.Data.Span.SequenceEqual(Helper.TrueArray) == false)
{ {
return false; return false;
@@ -133,7 +133,7 @@ namespace linker.messenger.updater
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.ExitForward, MessengerId = (ushort)UpdaterMessengerIds.ExitForward,
Payload = serializer.Serialize(param.Content) Payload = serializer.Serialize(param.Content)
}); }).ConfigureAwait(false);
} }
return true; return true;
} }
@@ -144,7 +144,7 @@ namespace linker.messenger.updater
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.SubscribeForward MessengerId = (ushort)UpdaterMessengerIds.SubscribeForward
}); }).ConfigureAwait(false);
} }
public async Task Check(ApiControllerParamsInfo param) public async Task Check(ApiControllerParamsInfo param)
{ {
@@ -155,7 +155,7 @@ namespace linker.messenger.updater
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.CheckForward, MessengerId = (ushort)UpdaterMessengerIds.CheckForward,
Payload = string.IsNullOrWhiteSpace(param.Content) ? Helper.EmptyArray : serializer.Serialize(param.Content) Payload = string.IsNullOrWhiteSpace(param.Content) ? Helper.EmptyArray : serializer.Serialize(param.Content)
}); }).ConfigureAwait(false);
} }
if (string.IsNullOrWhiteSpace(param.Content) || param.Content == signInClientStore.Id) if (string.IsNullOrWhiteSpace(param.Content) || param.Content == signInClientStore.Id)

View File

@@ -91,7 +91,7 @@ namespace linker.messenger.updater
{ {
TimerHelper.SetIntervalLong(async () => TimerHelper.SetIntervalLong(async () =>
{ {
await GetUpdateInfo(); await GetUpdateInfo().ConfigureAwait(false);
if (updateInfo.Updated) if (updateInfo.Updated)
{ {
updateInfo.MachineId = signInClientStore.Id; updateInfo.MachineId = signInClientStore.Id;
@@ -113,7 +113,7 @@ namespace linker.messenger.updater
MachineId = updateInfo.MachineId MachineId = updateInfo.MachineId
} }
}), }),
}); }).ConfigureAwait(false);
} }
Update(updateInfo); Update(updateInfo);
} }
@@ -136,7 +136,7 @@ namespace linker.messenger.updater
{ {
Connection = signInClientState.Connection, Connection = signInClientState.Connection,
MessengerId = (ushort)UpdaterMessengerIds.UpdateServer, MessengerId = (ushort)UpdaterMessengerIds.UpdateServer,
}); }).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{ {
UpdaterInfo info = serializer.Deserialize<UpdaterInfo>(resp.Data.Span); UpdaterInfo info = serializer.Deserialize<UpdaterInfo>(resp.Data.Span);

View File

@@ -36,7 +36,7 @@ namespace linker.messenger.updater
using HttpClientHandler handler = new HttpClientHandler(); using HttpClientHandler handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true; handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using HttpClient httpClient = new HttpClient(handler); using HttpClient httpClient = new HttpClient(handler);
string str = await httpClient.GetStringAsync($"{updaterCommonTransfer.UpdateUrl}/version.txt").WaitAsync(TimeSpan.FromSeconds(15)); string str = await httpClient.GetStringAsync($"{updaterCommonTransfer.UpdateUrl}/version.txt").WaitAsync(TimeSpan.FromSeconds(15)).ConfigureAwait(false);
string[] arr = str.Split(Environment.NewLine).Select(c => c.Trim('\r').Trim('\n')).ToArray(); string[] arr = str.Split(Environment.NewLine).Select(c => c.Trim('\r').Trim('\n')).ToArray();
@@ -83,18 +83,18 @@ namespace linker.messenger.updater
LoggerHelper.Instance.Warning($"updater {url}"); LoggerHelper.Instance.Warning($"updater {url}");
using HttpClient httpClient = new HttpClient(); using HttpClient httpClient = new HttpClient();
using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
updateInfo.Length = response.Content.Headers.ContentLength ?? 0; updateInfo.Length = response.Content.Headers.ContentLength ?? 0;
using Stream contentStream = await response.Content.ReadAsStreamAsync(); using Stream contentStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
using FileStream fileStream = new FileStream("updater.zip", FileMode.OpenOrCreate, FileAccess.ReadWrite); using FileStream fileStream = new FileStream("updater.zip", FileMode.OpenOrCreate, FileAccess.ReadWrite);
byte[] buffer = new byte[4096]; byte[] buffer = new byte[4096];
int readBytes = 0; int readBytes = 0;
while ((readBytes = await contentStream.ReadAsync(buffer)) != 0) while ((readBytes = await contentStream.ReadAsync(buffer).ConfigureAwait(false)) != 0)
{ {
await fileStream.WriteAsync(buffer.AsMemory(0, readBytes)); await fileStream.WriteAsync(buffer.AsMemory(0, readBytes)).ConfigureAwait(false);
updateInfo.Current += readBytes; updateInfo.Current += readBytes;
} }
@@ -169,7 +169,7 @@ namespace linker.messenger.updater
using FileStream fileStream = File.Create(entryPath); using FileStream fileStream = File.Create(entryPath);
byte[] buffer = new byte[4096]; byte[] buffer = new byte[4096];
int bytesRead; int bytesRead;
while ((bytesRead = await entryStream.ReadAsync(buffer)) != 0) while ((bytesRead = await entryStream.ReadAsync(buffer).ConfigureAwait(false)) != 0)
{ {
await fileStream.WriteAsync(buffer.AsMemory(0, bytesRead)); await fileStream.WriteAsync(buffer.AsMemory(0, bytesRead));
updateInfo.Current += bytesRead; updateInfo.Current += bytesRead;
@@ -203,8 +203,8 @@ namespace linker.messenger.updater
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
await DownloadUpdate(updateInfo, version); await DownloadUpdate(updateInfo, version).ConfigureAwait(false);
await ExtractUpdate(updateInfo); await ExtractUpdate(updateInfo).ConfigureAwait(false);
if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS()) if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
{ {

View File

@@ -235,7 +235,7 @@ namespace linker.messenger.updater
{ {
Connection = cache1.Connection, Connection = cache1.Connection,
MessengerId = (ushort)UpdaterMessengerIds.Exit MessengerId = (ushort)UpdaterMessengerIds.Exit
}); }).ConfigureAwait(false);
} }
} }

View File

@@ -28,11 +28,11 @@ namespace linker.messenger.updater
private void CheckTask() private void CheckTask()
{ {
TimerHelper.SetInterval(async () => TimerHelper.SetIntervalLong(async () =>
{ {
if (updaterCommonTransfer.CheckUpdate) if (updaterCommonTransfer.CheckUpdate)
{ {
await updaterHelper.GetUpdateInfo(updateInfo); await updaterHelper.GetUpdateInfo(updateInfo).ConfigureAwait(false);
} }
return true; return true;
}, () => updaterCommonTransfer.UpdateIntervalSeconds * 1000); }, () => updaterCommonTransfer.UpdateIntervalSeconds * 1000);

View File

@@ -447,7 +447,7 @@ namespace linker.messenger
if (pong == false) return; if (pong == false) return;
pong = false; pong = false;
pingTicks.Update(); pingTicks.Update();
await SendPingPong(pingBytes); await SendPingPong(pingBytes).ConfigureAwait(false);
} }
public override async Task<bool> SendAsync(ReadOnlyMemory<byte> data) public override async Task<bool> SendAsync(ReadOnlyMemory<byte> data)
{ {

View File

@@ -32,11 +32,11 @@ namespace linker.messenger
} }
public async Task Resolve(Socket socket, Memory<byte> memory) public async Task Resolve(Socket socket, Memory<byte> memory)
{ {
await messengerResolver.BeginReceiveServer(socket, memory); await messengerResolver.BeginReceiveServer(socket, memory).ConfigureAwait(false);
} }
public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory) public async Task Resolve(Socket socket, IPEndPoint ep, Memory<byte> memory)
{ {
await messengerResolver.BeginReceiveServer(socket, ep, memory); await messengerResolver.BeginReceiveServer(socket, ep, memory).ConfigureAwait(false);
} }
} }
@@ -94,7 +94,7 @@ namespace linker.messenger
/// <returns></returns> /// <returns></returns>
public async Task BeginReceiveServer(Socket socket, IPEndPoint ep, Memory<byte> memory) public async Task BeginReceiveServer(Socket socket, IPEndPoint ep, Memory<byte> memory)
{ {
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
/// <summary> /// <summary>
@@ -104,7 +104,7 @@ namespace linker.messenger
/// <returns></returns> /// <returns></returns>
public async Task<IConnection> BeginReceiveClient(Socket socket) public async Task<IConnection> BeginReceiveClient(Socket socket)
{ {
return await BeginReceiveClient(socket, false, 0, Helper.EmptyArray); return await BeginReceiveClient(socket, false, 0, Helper.EmptyArray).ConfigureAwait(false);
} }
/// <summary> /// <summary>
/// 以客户端模式接收数据 /// 以客户端模式接收数据

View File

@@ -49,7 +49,7 @@ namespace linker.messenger
if (resolvers.TryGetValue(type, out IResolver resolver)) if (resolvers.TryGetValue(type, out IResolver resolver))
{ {
await resolver.Resolve(socket, buffer.AsMemory(1, length)); await resolver.Resolve(socket, buffer.AsMemory(1, length)).ConfigureAwait(false);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -73,7 +73,7 @@ namespace linker.messenger
{ {
if (resolvers.TryGetValue(memory.Span[0], out IResolver resolver)) if (resolvers.TryGetValue(memory.Span[0], out IResolver resolver))
{ {
await resolver.Resolve(socket, ep, memory.Slice(1)); await resolver.Resolve(socket, ep, memory.Slice(1)).ConfigureAwait(false);
} }
} }
} }

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project ver="10" name="linker.route.win" libEmbed="true" icon="res\favicon.ico" ui="win" output="linker.route.win.exe" CompanyName="snltty" FileDescription="linker.route.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.route.win" InternalName="linker.route.win" FileVersion="0.0.0.18" ProductVersion="0.0.0.18" publishDir="/dist/" dstrip="false"> <project ver="10" name="linker.route.win" libEmbed="true" icon="res\favicon.ico" ui="win" output="linker.route.win.exe" CompanyName="snltty" FileDescription="linker.route.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.route.win" InternalName="linker.route.win" FileVersion="0.0.0.19" ProductVersion="0.0.0.19" publishDir="/dist/" dstrip="false">
<file name="main.aardio" path="main.aardio" comment="main.aardio"/> <file name="main.aardio" path="main.aardio" comment="main.aardio"/>
<folder name="资源文件" path="res" embed="true" local="false" ignored="false"> <folder name="资源文件" path="res" embed="true" local="false" ignored="false">
<file name="Program.cs" path="res\Program.cs" comment="res\Program.cs"/> <file name="Program.cs" path="res\Program.cs" comment="res\Program.cs"/>

Binary file not shown.

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.217" ProductVersion="0.0.0.217" publishDir="/dist/" dstrip="false" local="false" ignored="false"> <project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.219" ProductVersion="0.0.0.219" publishDir="/dist/" dstrip="false" local="false" ignored="false">
<file name="main.aardio" path="main.aardio" comment="main.aardio"/> <file name="main.aardio" path="main.aardio" comment="main.aardio"/>
<folder name="资源文件" path="res" embed="true" local="false" ignored="false"> <folder name="资源文件" path="res" embed="true" local="false" ignored="false">
<file name="favicon.ico" path="res\favicon.ico" comment="res\favicon.ico"/> <file name="favicon.ico" path="res\favicon.ico" comment="res\favicon.ico"/>

Binary file not shown.

View File

@@ -29,7 +29,7 @@ namespace linker.tun
public async Task Callback(LinkerTunDevicPacket packet) public async Task Callback(LinkerTunDevicPacket packet)
{ {
TCPUDPRead(packet); TCPUDPRead(packet);
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
private unsafe void TCPUDPRead(LinkerTunDevicPacket packet) private unsafe void TCPUDPRead(LinkerTunDevicPacket packet)
{ {
@@ -60,7 +60,7 @@ namespace linker.tun
public async Task Callback(LinkerTunDevicPacket packet) public async Task Callback(LinkerTunDevicPacket packet)
{ {
ICMPAnswer(packet); ICMPAnswer(packet);
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
private unsafe void ICMPAnswer(LinkerTunDevicPacket packet) private unsafe void ICMPAnswer(LinkerTunDevicPacket packet)
{ {

View File

@@ -35,6 +35,8 @@ namespace linker.tun
/// </summary> /// </summary>
public void Shutdown(); public void Shutdown();
public void Refresh();
/// <summary> /// <summary>
/// 设置MTU /// 设置MTU
/// </summary> /// </summary>

View File

@@ -1,4 +1,5 @@
using linker.libs; 
using linker.libs;
using linker.libs.extends; using linker.libs.extends;
using Microsoft.Win32.SafeHandles; using Microsoft.Win32.SafeHandles;
using System.Net; using System.Net;
@@ -25,7 +26,7 @@ namespace linker.tun
} }
public bool Setup(string name,IPAddress address, IPAddress gateway, byte prefixLength, out string error) public bool Setup(string name, IPAddress address, IPAddress gateway, byte prefixLength, out string error)
{ {
this.name = name; this.name = name;
error = string.Empty; error = string.Empty;
@@ -126,6 +127,20 @@ namespace linker.tun
CommandHelper.Linux(string.Empty, new string[] { $"ip link del {Name}", $"ip tuntap del mode tun dev {Name}" }); CommandHelper.Linux(string.Empty, new string[] { $"ip link del {Name}", $"ip tuntap del mode tun dev {Name}" });
} }
public void Refresh()
{
if (fs == null) return;
try
{
CommandHelper.Linux(string.Empty, new string[] {
$"ip link set dev {Name} up"
});
}
catch (Exception)
{
}
}
public void SetMtu(int value) public void SetMtu(int value)
{ {
CommandHelper.Linux(string.Empty, new string[] { $"ip link set dev {Name} mtu {value}" }); CommandHelper.Linux(string.Empty, new string[] { $"ip link set dev {Name} mtu {value}" });
@@ -300,6 +315,8 @@ namespace linker.tun
private object writeLockObj = new object(); private object writeLockObj = new object();
public ReadOnlyMemory<byte> Read() public ReadOnlyMemory<byte> Read()
{ {
if (fs == null) return Helper.EmptyArray;
int length = fs.Read(buffer.AsSpan(4)); int length = fs.Read(buffer.AsSpan(4));
length.ToBytes(buffer); length.ToBytes(buffer);
return buffer.AsMemory(0, length + 4); return buffer.AsMemory(0, length + 4);
@@ -326,7 +343,7 @@ namespace linker.tun
public async Task<bool> CheckAvailable() public async Task<bool> CheckAvailable()
{ {
string output = CommandHelper.Linux(string.Empty, new string[] { $"ip link show {Name}" }); string output = CommandHelper.Linux(string.Empty, new string[] { $"ip link show {Name}" });
return await Task.FromResult(output.Contains("state UP")); return await Task.FromResult(output.Contains("state UP")).ConfigureAwait(false);
} }
} }

View File

@@ -2,6 +2,7 @@
using linker.libs.extends; using linker.libs.extends;
using Microsoft.Win32.SafeHandles; using Microsoft.Win32.SafeHandles;
using System.Net; using System.Net;
using System.Threading;
namespace linker.tun namespace linker.tun
{ {
@@ -59,6 +60,10 @@ namespace linker.tun
IPAddress network = NetworkHelper.ToNetworkIP(address, NetworkHelper.ToPrefixValue(this.prefixLength)); IPAddress network = NetworkHelper.ToNetworkIP(address, NetworkHelper.ToPrefixValue(this.prefixLength));
CommandHelper.Osx(string.Empty, new string[] { $"route delete -net {network}/{prefixLength} {address}" }); CommandHelper.Osx(string.Empty, new string[] { $"route delete -net {network}/{prefixLength} {address}" });
} }
public void Refresh()
{
}
public void AddRoute(LinkerTunDeviceRouteItem[] ips, IPAddress ip) public void AddRoute(LinkerTunDeviceRouteItem[] ips, IPAddress ip)
{ {
@@ -179,7 +184,7 @@ namespace linker.tun
public async Task<bool> CheckAvailable() public async Task<bool> CheckAvailable()
{ {
return await Task.FromResult(true); return await Task.FromResult(true).ConfigureAwait(false);
} }
} }
} }

View File

@@ -131,6 +131,15 @@ namespace linker.tun
return true; return true;
} }
/// <summary>
/// 刷新网卡
/// </summary>
public void Refresh()
{
linkerTunDevice?.Refresh();
}
/// <summary> /// <summary>
/// 添加NAT转发,这会将来到本网卡且目标IP不是本网卡IP的包转发到其它网卡 /// 添加NAT转发,这会将来到本网卡且目标IP不是本网卡IP的包转发到其它网卡
/// </summary> /// </summary>
@@ -193,7 +202,7 @@ namespace linker.tun
private void Read() private void Read()
{ {
TimerHelper.AsyncLong(async () => TimerHelper.Async(async () =>
{ {
cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource = new CancellationTokenSource();
while (cancellationTokenSource.IsCancellationRequested == false) while (cancellationTokenSource.IsCancellationRequested == false)
@@ -203,9 +212,7 @@ namespace linker.tun
ReadOnlyMemory<byte> buffer = linkerTunDevice.Read(); ReadOnlyMemory<byte> buffer = linkerTunDevice.Read();
if (buffer.Length == 0) if (buffer.Length == 0)
{ {
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) await Task.Delay(1000);
LoggerHelper.Instance.Warning($"read buffer 0, stop device");
Shutdown();
break; break;
} }
@@ -226,8 +233,7 @@ namespace linker.tun
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Warning($"read buffer Exception, stop device"); LoggerHelper.Instance.Warning($"read buffer Exception, stop device");
setupError = ex.Message; setupError = ex.Message;
Shutdown(); await Task.Delay(1000);
break;
} }
} }
}); });

View File

@@ -42,15 +42,18 @@ namespace linker.tun
error = ($"Adapter already exists"); error = ($"Adapter already exists");
return false; return false;
} }
ClearRegistry(); Guid guid = Guid.Parse("771EF382-8718-5BC5-EBF0-A28B86142278");
Guid guid = Guid.NewGuid();
adapter = WinTun.WintunCreateAdapter(name, name, ref guid); adapter = WinTun.WintunCreateAdapter(name, name, ref guid);
if (adapter == 0) if (adapter == 0)
{
adapter = WinTun.WintunOpenAdapter(name);
if(adapter == 0)
{ {
error = ($"Failed to create adapter {Marshal.GetLastWin32Error()}"); error = ($"Failed to create adapter {Marshal.GetLastWin32Error()}");
Shutdown(); Shutdown();
return false; return false;
} }
}
uint version = WinTun.WintunGetRunningDriverVersion(); uint version = WinTun.WintunGetRunningDriverVersion();
session = WinTun.WintunStartSession(adapter, 0x400000); session = WinTun.WintunStartSession(adapter, 0x400000);
if (session == 0) if (session == 0)
@@ -87,6 +90,10 @@ namespace linker.tun
private void AddIPV4() private void AddIPV4()
{ {
try
{
if (session == 0) return;
WinTun.WintunGetAdapterLUID(adapter, out ulong luid); WinTun.WintunGetAdapterLUID(adapter, out ulong luid);
{ {
WinTun.MIB_UNICASTIPADDRESS_ROW AddressRow = default; WinTun.MIB_UNICASTIPADDRESS_ROW AddressRow = default;
@@ -100,6 +107,10 @@ namespace linker.tun
if (LastError != 0) throw new InvalidOperationException(); if (LastError != 0) throw new InvalidOperationException();
} }
} }
catch (Exception)
{
}
}
private void AddIPV6() private void AddIPV6()
{ {
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == Name); NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == Name);
@@ -139,6 +150,25 @@ namespace linker.tun
interfaceNumber = 0; interfaceNumber = 0;
} }
public void Refresh()
{
if (session == 0) return;
try
{
WinTun.SetEvent(waitHandle);
WinTun.WintunEndSession(session);
CommandHelper.Windows(string.Empty, new string[] { $"netsh interface set interface {Name} enable" });
session = WinTun.WintunStartSession(adapter, 0x400000);
waitHandle = WinTun.WintunGetReadWaitEvent(session);
AddIPV4();
AddIPV6();
}
catch (Exception)
{
}
}
public void SetMtu(int value) public void SetMtu(int value)
{ {
CommandHelper.Windows(string.Empty, new string[] { CommandHelper.Windows(string.Empty, new string[] {
@@ -270,6 +300,7 @@ namespace linker.tun
private byte[] buffer = new byte[8 * 1024]; private byte[] buffer = new byte[8 * 1024];
public unsafe ReadOnlyMemory<byte> Read() public unsafe ReadOnlyMemory<byte> Read()
{ {
if (session == 0) return Helper.EmptyArray;
for (; tokenSource.IsCancellationRequested == false;) for (; tokenSource.IsCancellationRequested == false;)
{ {
IntPtr packet = WinTun.WintunReceivePacket(session, out var packetSize); IntPtr packet = WinTun.WintunReceivePacket(session, out var packetSize);
@@ -356,94 +387,20 @@ namespace linker.tun
} }
} }
private void ClearRegistry()
{
string[] delValues = [Name];
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkList\\Profiles");
foreach (var item in key.GetSubKeyNames())
{
RegistryKey itemKey = key.OpenSubKey(item);
string value = itemKey.GetValue("Description", string.Empty).ToString();
itemKey.Close();
if (delValues.Any(c => value.StartsWith($"{c}") || value == c))
{
try
{
Registry.LocalMachine.DeleteSubKey($"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkList\\Profiles\\{item}");
}
catch (Exception)
{
}
}
}
key.Close();
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkList\\Signatures\\Unmanaged");
foreach (var item in key.GetSubKeyNames())
{
RegistryKey itemKey = key.OpenSubKey(item);
string value = itemKey.GetValue("Description", string.Empty).ToString();
itemKey.Close();
if (delValues.Any(c => value.StartsWith($"{c}") || value == c))
{
try
{
Registry.LocalMachine.DeleteSubKey($"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkList\\Signatures\\Unmanaged\\{item}");
}
catch (Exception)
{
}
}
}
key.Close();
}
catch (Exception)
{
}
}
public async Task<bool> CheckAvailable() public async Task<bool> CheckAvailable()
{ {
InterfaceOrder(); InterfaceOrder();
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == Name || c.Description == $"{Name} Tunnel" || c.Name.Contains(Name)); NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces()
.FirstOrDefault(c => c.Name == Name || c.Description == $"{Name} Tunnel" || c.Name.Contains(Name));
if (networkInterface == null) UnicastIPAddressInformation firstIpv4 = networkInterface?.GetIPProperties()
.UnicastAddresses.FirstOrDefault(c => c.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
if (networkInterface == null || firstIpv4 == null || firstIpv4.Address == null || firstIpv4.Address.Equals(address) == false)
{ {
return false; return false;
} }
return await Task.FromResult(true);
UnicastIPAddressInformation firstIpv4 = networkInterface.GetIPProperties().UnicastAddresses.FirstOrDefault(c => c.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
if (firstIpv4 == null || firstIpv4.Address == null || firstIpv4.Address.Equals(address) == false)
{
return true;
}
return await InterfacePing();
async Task<bool> InterfacePing()
{
for (int i = 0; i < 10; i++)
{
try
{
using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(address, 30);
if (pingReply.Status != IPStatus.TimedOut)
{
return pingReply.Status == IPStatus.Success;
}
LoggerHelper.Instance.Error($"ping {address} at {i}->TimedOut");
}
catch (Exception ex)
{
LoggerHelper.Instance.Error($"ping {address} at {i}->{ex}");
}
await Task.Delay(2000);
}
return false;
}
} }
private void InterfaceOrder() private void InterfaceOrder()
{ {
@@ -478,6 +435,7 @@ namespace linker.tun
} }
} }
} }
} }
} }

View File

@@ -17,7 +17,7 @@ namespace linker.tunnel
private TunnelWanPortTransfer tunnelWanPortTransfer; private TunnelWanPortTransfer tunnelWanPortTransfer;
private TunnelUpnpTransfer tunnelUpnpTransfer; private TunnelUpnpTransfer tunnelUpnpTransfer;
private ConcurrentDictionary<string, bool> connectingDic = new ConcurrentDictionary<string, bool>(); private OperatingMultipleManager operating = new OperatingMultipleManager();
private uint flowid = 1; private uint flowid = 1;
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>(); private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
@@ -48,7 +48,7 @@ namespace linker.tunnel
} }
private async Task RebuildTransports() private async Task RebuildTransports()
{ {
var transportItems = (await tunnelMessengerAdapter.GetTunnelTransports()).ToList(); var transportItems = (await tunnelMessengerAdapter.GetTunnelTransports().ConfigureAwait(false)).ToList();
//有新的协议 //有新的协议
var newTransportNames = transports.Select(c => c.Name).Except(transportItems.Select(c => c.Name)); var newTransportNames = transports.Select(c => c.Name).Except(transportItems.Select(c => c.Name));
if (newTransportNames.Any()) if (newTransportNames.Any())
@@ -99,7 +99,7 @@ namespace linker.tunnel
} }
} }
await tunnelMessengerAdapter.SetTunnelTransports(transportItems); await tunnelMessengerAdapter.SetTunnelTransports(transportItems).ConfigureAwait(false);
LoggerHelper.Instance.Info($"load tunnel transport:{string.Join(",", transports.Select(c => c.GetType().Name))}"); LoggerHelper.Instance.Info($"load tunnel transport:{string.Join(",", transports.Select(c => c.GetType().Name))}");
} }
@@ -139,8 +139,8 @@ namespace linker.tunnel
var socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp); var socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try try
{ {
await socket.ConnectAsync(server); await socket.ConnectAsync(server).ConfigureAwait(false);
await socket.SendAsync(new byte[] { 255 }); await socket.SendAsync(new byte[] { 255 }).ConfigureAwait(false);
return (socket.LocalEndPoint as IPEndPoint).Address; return (socket.LocalEndPoint as IPEndPoint).Address;
} }
catch (Exception) catch (Exception)
@@ -193,7 +193,7 @@ namespace linker.tunnel
/// <returns></returns> /// <returns></returns>
public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, TunnelProtocolType denyProtocols) public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, TunnelProtocolType denyProtocols)
{ {
return await ConnectAsync(remoteMachineId, transactionId, transactionId, denyProtocols); return await ConnectAsync(remoteMachineId, transactionId, transactionId, denyProtocols).ConfigureAwait(false);
} }
/// <summary> /// <summary>
/// 开始连接对方 /// 开始连接对方
@@ -205,11 +205,11 @@ namespace linker.tunnel
/// <returns></returns> /// <returns></returns>
public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, string transactionTag, TunnelProtocolType denyProtocols) public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, string transactionTag, TunnelProtocolType denyProtocols)
{ {
if (connectingDic.TryAdd(remoteMachineId, true) == false) return null; if (operating.StartOperation(remoteMachineId) == false) return null;
try try
{ {
var _transports = await tunnelMessengerAdapter.GetTunnelTransports(); var _transports = await tunnelMessengerAdapter.GetTunnelTransports().ConfigureAwait(false);
foreach (TunnelTransportItemInfo transportItem in _transports.OrderBy(c => c.Order).Where(c => c.Disabled == false)) foreach (TunnelTransportItemInfo transportItem in _transports.OrderBy(c => c.Order).Where(c => c.Disabled == false))
{ {
ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == transportItem.Name); ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == transportItem.Name);
@@ -311,7 +311,7 @@ namespace linker.tunnel
} }
finally finally
{ {
connectingDic.TryRemove(remoteMachineId, out _); operating.StopOperation(remoteMachineId);
} }
return null; return null;
} }
@@ -321,13 +321,13 @@ namespace linker.tunnel
/// <param name="tunnelTransportInfo"></param> /// <param name="tunnelTransportInfo"></param>
public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo)
{ {
if (connectingDic.TryAdd(tunnelTransportInfo.Remote.MachineId, true) == false) if (operating.StartOperation(tunnelTransportInfo.Remote.MachineId) == false)
{ {
return; return;
} }
try try
{ {
var _transports = await tunnelMessengerAdapter.GetTunnelTransports(); var _transports = await tunnelMessengerAdapter.GetTunnelTransports().ConfigureAwait(false);
ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.ProtocolType == tunnelTransportInfo.TransportType); ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.ProtocolType == tunnelTransportInfo.TransportType);
TunnelTransportItemInfo item = _transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.Disabled == false); TunnelTransportItemInfo item = _transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.Disabled == false);
if (transport != null && item != null) if (transport != null && item != null)
@@ -337,18 +337,18 @@ namespace linker.tunnel
ParseRemoteEndPoint(tunnelTransportInfo); ParseRemoteEndPoint(tunnelTransportInfo);
_ = transport.OnBegin(tunnelTransportInfo).ContinueWith((result) => _ = transport.OnBegin(tunnelTransportInfo).ContinueWith((result) =>
{ {
connectingDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out _); operating.StopOperation(tunnelTransportInfo.Remote.MachineId);
}); });
} }
else else
{ {
connectingDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out _); operating.StopOperation(tunnelTransportInfo.Remote.MachineId);
_ = tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo); _ = tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
connectingDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out _); operating.StopOperation(tunnelTransportInfo.Remote.MachineId);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{ {
LoggerHelper.Instance.Error(ex); LoggerHelper.Instance.Error(ex);
@@ -534,20 +534,20 @@ namespace linker.tunnel
{ {
ITunnelConnection connection = null; ITunnelConnection connection = null;
await Task.Delay(delay); await Task.Delay(delay).ConfigureAwait(false);
for (int i = 1; i <= times; i++) for (int i = 1; i <= times; i++)
{ {
if (stopCallback()) break; if (stopCallback()) break;
connection = await ConnectAsync(remoteMachineId, transactionId, denyProtocols); connection = await ConnectAsync(remoteMachineId, transactionId, denyProtocols).ConfigureAwait(false);
if (connection != null) if (connection != null)
{ {
break; break;
} }
await Task.Delay(i * 3000); await Task.Delay(i * 3000).ConfigureAwait(false);
} }
await resultCallback(connection); await resultCallback(connection).ConfigureAwait(false);
} }
catch (Exception) catch (Exception)
{ {

View File

@@ -56,17 +56,17 @@ namespace linker.tunnel
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
await locker.WaitAsync(); await locker.WaitAsync().ConfigureAwait(false);
foreach (var device in natDevices.Values) foreach (var device in natDevices.Values)
{ {
try try
{ {
if (await HasMap(device, Protocol.Tcp, MapInfo.PublicPort) == false) if (await HasMap(device, Protocol.Tcp, MapInfo.PublicPort).ConfigureAwait(false) == false)
{ {
Mapping mapping = new Mapping(Protocol.Tcp, MapInfo.PrivatePort, MapInfo.PublicPort, 720, $"linker-tcp-{MapInfo.PublicPort}-{MapInfo.PrivatePort}"); Mapping mapping = new Mapping(Protocol.Tcp, MapInfo.PrivatePort, MapInfo.PublicPort, 720, $"linker-tcp-{MapInfo.PublicPort}-{MapInfo.PrivatePort}");
await device.CreatePortMapAsync(mapping); await device.CreatePortMapAsync(mapping).ConfigureAwait(false);
Mapping m = await device.GetSpecificMappingAsync(Protocol.Tcp, mapping.PublicPort); Mapping m = await device.GetSpecificMappingAsync(Protocol.Tcp, mapping.PublicPort).ConfigureAwait(false);
} }
} }
catch catch
@@ -75,11 +75,11 @@ namespace linker.tunnel
try try
{ {
if (await HasMap(device, Protocol.Udp, MapInfo.PublicPort) == false) if (await HasMap(device, Protocol.Udp, MapInfo.PublicPort).ConfigureAwait(false) == false)
{ {
Mapping mapping = new Mapping(Protocol.Udp, MapInfo.PrivatePort, MapInfo.PublicPort, 720, $"linker-udp-{MapInfo.PublicPort}-{MapInfo.PrivatePort}"); Mapping mapping = new Mapping(Protocol.Udp, MapInfo.PrivatePort, MapInfo.PublicPort, 720, $"linker-udp-{MapInfo.PublicPort}-{MapInfo.PrivatePort}");
await device.CreatePortMapAsync(mapping); await device.CreatePortMapAsync(mapping).ConfigureAwait(false);
Mapping m = await device.GetSpecificMappingAsync(Protocol.Udp, mapping.PublicPort); Mapping m = await device.GetSpecificMappingAsync(Protocol.Udp, mapping.PublicPort).ConfigureAwait(false);
} }
} }
catch catch
@@ -93,7 +93,7 @@ namespace linker.tunnel
{ {
try try
{ {
Mapping m = await device.GetSpecificMappingAsync(protocol, publicPort); Mapping m = await device.GetSpecificMappingAsync(protocol, publicPort).ConfigureAwait(false);
return true; return true;
} }
catch (Exception) catch (Exception)

View File

@@ -13,6 +13,7 @@ namespace linker.tunnel.connection
Tcp = 1, Tcp = 1,
Udp = 2, Udp = 2,
Quic = 4, Quic = 4,
All = 255
} }
/// <summary> /// <summary>
/// 隧道模式 /// 隧道模式

View File

@@ -167,7 +167,7 @@ namespace linker.tunnel.connection
{ {
try try
{ {
await callback.Receive(this, packet, this.userToken); await callback.Receive(this, packet, this.userToken).ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -233,6 +233,7 @@ namespace linker.tunnel.connection
public async Task<bool> SendAsync(ReadOnlyMemory<byte> data) public async Task<bool> SendAsync(ReadOnlyMemory<byte> data)
{ {
await semaphoreSlim.WaitAsync().ConfigureAwait(false); await semaphoreSlim.WaitAsync().ConfigureAwait(false);
try try
{ {
await Stream.WriteAsync(data, cancellationTokenSource.Token).ConfigureAwait(false); await Stream.WriteAsync(data, cancellationTokenSource.Token).ConfigureAwait(false);

View File

@@ -180,7 +180,7 @@ namespace linker.tunnel.connection
} }
try try
{ {
await callback.Receive(this, packet, this.userToken); await callback.Receive(this, packet, this.userToken).ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -262,7 +262,9 @@ namespace linker.tunnel.connection
if (callback == null) return false; if (callback == null) return false;
if (Stream != null) if (Stream != null)
{
await semaphoreSlim.WaitAsync().ConfigureAwait(false); await semaphoreSlim.WaitAsync().ConfigureAwait(false);
}
try try
{ {
if (Stream != null) if (Stream != null)

View File

@@ -103,7 +103,7 @@ namespace linker.tunnel.connection
{ {
break; break;
} }
await CallbackPacket(buffer.AsMemory(0, result.ReceivedBytes)).ConfigureAwait(false); await CallbackPacket(buffer, 0, result.ReceivedBytes).ConfigureAwait(false);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -121,21 +121,21 @@ namespace linker.tunnel.connection
} }
} }
public async Task<bool> ProcessWrite(Memory<byte> packet) public async Task<bool> ProcessWrite(byte[] buffer, int offset, int length)
{ {
if (callback == null) if (callback == null)
{ {
return false; return false;
} }
await CallbackPacket(packet).ConfigureAwait(false); await CallbackPacket(buffer, offset, length).ConfigureAwait(false);
return true; return true;
} }
private async Task CallbackPacket(Memory<byte> packet) private async Task CallbackPacket(byte[] buffer, int offset, int length)
{ {
ReceiveBytes += packet.Length; ReceiveBytes += length;
LastTicks.Update(); LastTicks.Update();
Memory<byte> memory = packet.Slice(4); Memory<byte> memory = buffer.AsMemory(offset, length);
if (memory.Length == pingBytes.Length && memory.Span.Slice(0, pingBytes.Length - 4).SequenceEqual(pingBytes.AsSpan(0, pingBytes.Length - 4))) if (memory.Length == pingBytes.Length && memory.Span.Slice(0, pingBytes.Length - 4).SequenceEqual(pingBytes.AsSpan(0, pingBytes.Length - 4)))
{ {
if (memory.Span.SequenceEqual(pingBytes)) if (memory.Span.SequenceEqual(pingBytes))
@@ -158,17 +158,16 @@ namespace linker.tunnel.connection
{ {
if (SSL) if (SSL)
{ {
packet.CopyTo(decodeBuffer); int writen = Crypto.Decode(buffer, offset, length, decodeBuffer, 0);
packet = Crypto.Decode(decodeBuffer, 0, packet.Length); memory = decodeBuffer.AsMemory(0, writen);
} }
await callback.Receive(this, memory, this.userToken).ConfigureAwait(false);
await callback.Receive(this, packet.Slice(4), this.userToken);
} }
catch (Exception ex) catch (Exception ex)
{ {
LoggerHelper.Instance.Error(ex); LoggerHelper.Instance.Error(ex);
LoggerHelper.Instance.Error($"udp connection error :{packet.Length}"); LoggerHelper.Instance.Error($"udp connection error :{length}");
LoggerHelper.Instance.Error($"udp connection error :{Encoding.UTF8.GetString(packet.Span)}"); LoggerHelper.Instance.Error($"udp connection error buffer:{Encoding.UTF8.GetString(buffer, offset, length)}");
} }
} }
} }
@@ -199,12 +198,24 @@ namespace linker.tunnel.connection
} }
private async Task SendPingPong(byte[] data) private async Task SendPingPong(byte[] data)
{ {
int length = 4 + data.Length; int length = 0;
byte[] heartData = ArrayPool<byte>.Shared.Rent(length); byte[] heartData = ArrayPool<byte>.Shared.Rent(1024);
data.Length.ToBytes(heartData); Memory<byte> memory = heartData.AsMemory();
data.AsMemory().CopyTo(heartData.AsMemory(4));
SendBytes += data.Length; //中继包头
if (Type == TunnelType.Relay)
{
length += 2;
heartData[0] = 2; //relay
heartData[1] = 1; //forward
memory = memory.Slice(2);
}
//真的数据
data.AsMemory().CopyTo(memory);
length += data.Length;
SendBytes += length;
try try
{ {
await UdpClient.SendToAsync(heartData.AsMemory(0, length), IPEndPoint, cancellationTokenSource.Token).ConfigureAwait(false); await UdpClient.SendToAsync(heartData.AsMemory(0, length), IPEndPoint, cancellationTokenSource.Token).ConfigureAwait(false);
@@ -230,17 +241,35 @@ namespace linker.tunnel.connection
} }
private byte[] encodeTempBuffer = new byte[8 * 1014];
private byte[] encodeBuffer = new byte[8 * 1024]; private byte[] encodeBuffer = new byte[8 * 1024];
private byte[] decodeBuffer = new byte[8 * 2014]; private byte[] decodeBuffer = new byte[8 * 1014];
public async Task<bool> SendAsync(ReadOnlyMemory<byte> data) public async Task<bool> SendAsync(ReadOnlyMemory<byte> data)
{ {
try try
{ {
data = data.Slice(4);
int skip = 0;
if (Type == TunnelType.Relay)
{
skip = 2;
encodeBuffer[0] = 2; //relay
encodeBuffer[1] = 1; //forward
}
if (SSL) if (SSL)
{ {
data.CopyTo(encodeBuffer); data.CopyTo(encodeTempBuffer);
data = Crypto.Encode(encodeBuffer, 0, data.Length); int length = Crypto.Encode(encodeTempBuffer, 0, data.Length, encodeBuffer, skip);
data = encodeBuffer.AsMemory(0, length + skip);
} }
else
{
data.CopyTo(encodeBuffer.AsMemory(skip));
data = encodeBuffer.AsMemory(0, data.Length + skip);
}
await UdpClient.SendToAsync(data, IPEndPoint, cancellationTokenSource.Token).ConfigureAwait(false); await UdpClient.SendToAsync(data, IPEndPoint, cancellationTokenSource.Token).ConfigureAwait(false);
SendBytes += data.Length; SendBytes += data.Length;
return true; return true;

View File

@@ -87,7 +87,7 @@ namespace linker.tunnel.transport
{ {
return null; return null;
} }
await Task.Delay(100); await Task.Delay(100).ConfigureAwait(false);
ITunnelConnection connection = await ConnectForward(tunnelTransportInfo).ConfigureAwait(false); ITunnelConnection connection = await ConnectForward(tunnelTransportInfo).ConfigureAwait(false);
if (connection != null) if (connection != null)
{ {
@@ -645,7 +645,7 @@ namespace linker.tunnel.transport
} }
} }
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
/// <summary> /// <summary>

View File

@@ -57,7 +57,7 @@ namespace linker.tunnel.transport
SemaphoreSlim slim = new SemaphoreSlim(1); SemaphoreSlim slim = new SemaphoreSlim(1);
public async Task Listen(int localPort) public async Task Listen(int localPort)
{ {
await slim.WaitAsync(); await slim.WaitAsync().ConfigureAwait(false);
try try
{ {
if (localPort == 0) return; if (localPort == 0) return;
@@ -90,20 +90,20 @@ namespace linker.tunnel.transport
{ {
try try
{ {
Socket client = await socket.AcceptAsync(); Socket client = await socket.AcceptAsync().ConfigureAwait(false);
TimerHelper.Async(async () => TimerHelper.Async(async () =>
{ {
try try
{ {
byte[] bytes = new byte[1024]; byte[] bytes = new byte[1024];
int length = await client.ReceiveAsync(bytes.AsMemory()).AsTask().WaitAsync(TimeSpan.FromMilliseconds(3000)); int length = await client.ReceiveAsync(bytes.AsMemory()).AsTask().WaitAsync(TimeSpan.FromMilliseconds(3000)).ConfigureAwait(false);
if (length > 0) if (length > 0)
{ {
string key = bytes.AsMemory(0, length).GetString(); string key = bytes.AsMemory(0, length).GetString();
if (distDic.TryRemove(key, out TaskCompletionSource<Socket> tcs)) if (distDic.TryRemove(key, out TaskCompletionSource<Socket> tcs))
{ {
await client.SendAsync(bytes.AsMemory(0, length)); await client.SendAsync(bytes.AsMemory(0, length)).ConfigureAwait(false);
tcs.SetResult(client); tcs.SetResult(client);
return; return;
} }
@@ -247,7 +247,7 @@ namespace linker.tunnel.transport
distDic.TryAdd(key, tcs); distDic.TryAdd(key, tcs);
try try
{ {
Socket socket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(5000)); Socket socket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
socket.KeepAlive(); socket.KeepAlive();
SslStream sslStream = null; SslStream sslStream = null;
@@ -323,8 +323,8 @@ namespace linker.tunnel.transport
} }
await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
await targetSocket.SendAsync($"{tunnelTransportInfo.Local.MachineId}-{tunnelTransportInfo.FlowId}".ToBytes()); await targetSocket.SendAsync($"{tunnelTransportInfo.Local.MachineId}-{tunnelTransportInfo.FlowId}".ToBytes()).ConfigureAwait(false);
await targetSocket.ReceiveAsync(new byte[1024]).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); ; await targetSocket.ReceiveAsync(new byte[1024]).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
//需要ssl //需要ssl
SslStream sslStream = null; SslStream sslStream = null;

View File

@@ -225,7 +225,7 @@ namespace linker.tunnel.transport
{ {
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, new IPEndPoint(IPAddress.IPv6Any, 0)).ConfigureAwait(false); SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, new IPEndPoint(IPAddress.IPv6Any, 0)).ConfigureAwait(false);
await socket.SendToAsync(endBytes, result.RemoteEndPoint); await socket.SendToAsync(endBytes, result.RemoteEndPoint).ConfigureAwait(false);
tcs.SetResult(result.RemoteEndPoint as IPEndPoint); tcs.SetResult(result.RemoteEndPoint as IPEndPoint);
}); });
return socket; return socket;
@@ -287,7 +287,7 @@ namespace linker.tunnel.transport
} }
else else
{ {
await token.LocalUdp.SendToAsync(buffer.AsMemory(0, result.ReceivedBytes), result.RemoteEndPoint); await token.LocalUdp.SendToAsync(buffer.AsMemory(0, result.ReceivedBytes), result.RemoteEndPoint).ConfigureAwait(false);
} }
} }
} }
@@ -429,7 +429,7 @@ namespace linker.tunnel.transport
} }
} }
} }
await Task.CompletedTask; await Task.CompletedTask.ConfigureAwait(false);
} }
sealed class ListenAsyncToken sealed class ListenAsyncToken

View File

@@ -91,7 +91,7 @@ namespace linker.tunnel.transport
{ {
try try
{ {
SocketReceiveFromResult result = await socket.ReceiveFromAsync(bytes.AsMemory(), ep); SocketReceiveFromResult result = await socket.ReceiveFromAsync(bytes.AsMemory(), ep).ConfigureAwait(false);
if (result.ReceivedBytes == 0) if (result.ReceivedBytes == 0)
{ {
break; break;
@@ -108,7 +108,7 @@ namespace linker.tunnel.transport
string key = memory.GetString(); string key = memory.GetString();
if (distDic.TryRemove(key, out TaskCompletionSource<State> tcs)) if (distDic.TryRemove(key, out TaskCompletionSource<State> tcs))
{ {
await socket.SendToAsync(memory, result.RemoteEndPoint); await socket.SendToAsync(memory, result.RemoteEndPoint).ConfigureAwait(false);
try try
{ {
State state = new State { Socket = socket, RemoteEndPoint = remoteEP }; State state = new State { Socket = socket, RemoteEndPoint = remoteEP };
@@ -122,7 +122,7 @@ namespace linker.tunnel.transport
} }
else if (cache.Connection != null) else if (cache.Connection != null)
{ {
bool success = await cache.Connection.ProcessWrite(memory); bool success = await cache.Connection.ProcessWrite(bytes,0, result.ReceivedBytes).ConfigureAwait(false);
if (success == false) if (success == false)
{ {
connectionsDic.TryRemove(remoteEP, out _); connectionsDic.TryRemove(remoteEP, out _);

View File

@@ -35,7 +35,7 @@ namespace linker.tunnel.wanport
{ {
for (byte i = 1; i < 10; i++) for (byte i = 1; i < 10; i++)
{ {
await Task.Delay(15); await Task.Delay(15).ConfigureAwait(false);
await udpClient.SendAsync(BuildSendData(buffer, i), server).ConfigureAwait(false); await udpClient.SendAsync(BuildSendData(buffer, i), server).ConfigureAwait(false);
} }
}); });
@@ -106,7 +106,7 @@ namespace linker.tunnel.wanport
socket.ReuseBind(new IPEndPoint(IPAddress.Any, 0)); socket.ReuseBind(new IPEndPoint(IPAddress.Any, 0));
await socket.ConnectAsync(server).ConfigureAwait(false); await socket.ConnectAsync(server).ConfigureAwait(false);
await socket.SendAsync(BuildSendData(buffer, (byte)new Random().Next(0, 255))); await socket.SendAsync(BuildSendData(buffer, (byte)new Random().Next(0, 255))).ConfigureAwait(false);
int length = await socket.ReceiveAsync(buffer.AsMemory(), SocketFlags.None).ConfigureAwait(false); int length = await socket.ReceiveAsync(buffer.AsMemory(), SocketFlags.None).ConfigureAwait(false);
for (int j = 0; j < length; j++) for (int j = 0; j < length; j++)

View File

@@ -131,6 +131,7 @@ export default {
'server.relayConnection': 'Conn', 'server.relayConnection': 'Conn',
'server.relayDelay': 'Delay', 'server.relayDelay': 'Delay',
'server.relayPublic': 'Public', 'server.relayPublic': 'Public',
'server.relayAllow': 'Allow',
'server.relayUrl': 'Url', 'server.relayUrl': 'Url',
'server.relayOper': 'Oper', 'server.relayOper': 'Oper',
'server.relayUse': 'Use', 'server.relayUse': 'Use',

View File

@@ -134,6 +134,7 @@ export default {
'server.relayConnection': '连接数', 'server.relayConnection': '连接数',
'server.relayDelay': '延迟', 'server.relayDelay': '延迟',
'server.relayPublic': '公开', 'server.relayPublic': '公开',
'server.relayAllow': '支持协议',
'server.relayUrl': 'Url', 'server.relayUrl': 'Url',
'server.relayOper': '操作', 'server.relayOper': '操作',
'server.relayUse': '使用', 'server.relayUse': '使用',

View File

@@ -4,9 +4,9 @@
<el-table :data="state.data" size="small" border height="500"> <el-table :data="state.data" size="small" border height="500">
<el-table-column property="RemoteMachineId" label="目标/服务器"> <el-table-column property="RemoteMachineId" label="目标/服务器">
<template #default="scope"> <template #default="scope">
<div :class="{green:scope.row.Connected}"> <div :class="{ green: scope.row.Connected }">
<p>{{scope.row.IPEndPoint}}</p> <p>{{ scope.row.IPEndPoint }}</p>
<p>ssl : {{scope.row.SSL}}</p> <p>ssl : {{ scope.row.SSL }}</p>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@@ -18,38 +18,41 @@
<el-table-column property="TransportName" label="协议"> <el-table-column property="TransportName" label="协议">
<template #default="scope"> <template #default="scope">
<div> <div>
<p>{{scope.row.TransportName}}({{ state.protocolTypes[scope.row.ProtocolType] }})</p> <p>{{ scope.row.TransportName }}({{ state.protocolTypes[scope.row.ProtocolType] }})</p>
<p>{{ state.types[scope.row.Type] }} - {{1<<scope.row.BufferSize}}KB</p> <p>{{ state.types[scope.row.Type] }} - {{ 1 << scope.row.BufferSize }}KB</p>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="Delay" label="延迟" width="60"> <el-table-column property="Delay" label="延迟" width="60">
<template #default="scope"> <template #default="scope">
<span>{{scope.row.Delay}}ms</span> <span>{{ scope.row.Delay }}ms</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="Bytes" label="通信"> <el-table-column property="Bytes" label="通信">
<template #default="scope"> <template #default="scope">
<div> <div>
<p>up : {{scope.row.SendBytesText}}</p> <p>up : {{ scope.row.SendBytesText }}</p>
<p>down : {{scope.row.ReceiveBytesText}}</p> <p>down : {{ scope.row.ReceiveBytesText }}</p>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="relay" label="中继节点"> <el-table-column property="relay" label="中继节点">
<template #default="scope"> <template #default="scope">
<div> <div>
<a href="javascript:;" class="a-line" @click="handleNode(scope.row)">{{ state.nodesDic[scope.row.NodeId] || '选择节点' }}</a> <a href="javascript:;" class="a-line" @click="handleNode(scope.row)">{{
state.nodesDic[scope.row.NodeId] || '选择节点' }}</a>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="54"> <el-table-column label="操作" width="54">
<template #default="scope"> <template #default="scope">
<div> <div>
<el-popconfirm v-if="hasTunnelRemove" confirm-button-text="确认" cancel-button-text="取消" title="确定关闭此连接?" <el-popconfirm v-if="hasTunnelRemove" confirm-button-text="确认" cancel-button-text="取消"
@confirm="handleDel(scope.row)"> title="确定关闭此连接?" @confirm="handleDel(scope.row)">
<template #reference> <template #reference>
<el-button type="danger" size="small"><el-icon><Delete /></el-icon></el-button> <el-button type="danger" size="small"><el-icon>
<Delete />
</el-icon></el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
</div> </div>
@@ -63,14 +66,22 @@
<el-table :data="state.nodes" size="small" border height="600"> <el-table :data="state.nodes" size="small" border height="600">
<el-table-column property="Name" :label="$t('server.relayName')"> <el-table-column property="Name" :label="$t('server.relayName')">
<template #default="scope"> <template #default="scope">
<div>
<a :href="scope.row.Url" class="a-line blue" target="_blank">{{ scope.row.Name }}</a> <a :href="scope.row.Url" class="a-line blue" target="_blank">{{ scope.row.Name }}</a>
<a href="javascript:;" class="a-line">
<span v-if="(scope.row.AllowProtocol & 1) == 1">,tcp</span>
<span v-if="(scope.row.AllowProtocol & 2) == 2">,udp</span>
</a>
</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="MaxGbTotal" :label="$t('server.relayFlow')" width="160"> <el-table-column property="MaxGbTotal" :label="$t('server.relayFlow')" width="140">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.MaxGbTotal == 0">--</span> <span v-if="scope.row.MaxGbTotal == 0">--</span>
<span v-else> <span v-else>
{{ (scope.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2) }}GB / {{ scope.row.MaxGbTotal }}GB {{ (scope.row.MaxGbTotalLastBytes / 1024 / 1024 / 1024).toFixed(2) }}GB / {{
scope.row.MaxGbTotal
}}GB
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@@ -80,10 +91,11 @@
<span v-else>{{ scope.row.MaxBandwidth }}Mbps</span> <span v-else>{{ scope.row.MaxBandwidth }}Mbps</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="MaxBandwidthTotal" :label="`${$t('server.relaySpeed2')}/${$t('server.relaySpeed1')}`" width="120"> <el-table-column property="MaxBandwidthTotal"
:label="`${$t('server.relaySpeed2')}/${$t('server.relaySpeed1')}`" width="120">
<template #default="scope"> <template #default="scope">
<span> <span>
<span>{{scope.row.BandwidthRatio}}Mbps</span> <span>{{ scope.row.BandwidthRatio }}Mbps</span>
<span>/</span> <span>/</span>
<span v-if="scope.row.MaxBandwidthTotal == 0">--</span> <span v-if="scope.row.MaxBandwidthTotal == 0">--</span>
<span v-else>{{ scope.row.MaxBandwidthTotal }}Mbps</span> <span v-else>{{ scope.row.MaxBandwidthTotal }}Mbps</span>
@@ -92,7 +104,7 @@
</el-table-column> </el-table-column>
<el-table-column property="ConnectionRatio" :label="$t('server.relayConnection')" width="80"> <el-table-column property="ConnectionRatio" :label="$t('server.relayConnection')" width="80">
<template #default="scope"> <template #default="scope">
<span><strong>{{scope.row.ConnectionRatio}}</strong>/{{scope.row.MaxConnection}}</span> <span><strong>{{ scope.row.ConnectionRatio }}</strong>/{{ scope.row.MaxConnection }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="Delay" :label="$t('server.relayDelay')" width="60"> <el-table-column property="Delay" :label="$t('server.relayDelay')" width="60">
@@ -102,12 +114,25 @@
</el-table-column> </el-table-column>
<el-table-column property="Public" :label="$t('server.relayPublic')" width="50"> <el-table-column property="Public" :label="$t('server.relayPublic')" width="50">
<template #default="scope"> <template #default="scope">
<el-switch disabled v-model="scope.row.Public " size="small" /> <el-switch disabled v-model="scope.row.Public" size="small" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="Oper" :label="$t('server.relayOper')" width="65"> <el-table-column property="Oper" :label="$t('server.relayOper')" width="75">
<template #default="scope"> <template #default="scope">
<el-button type="success" size="small" @click="handleConnect(scope.row.Id)">{{$t('server.relayUse')}}</el-button> <el-dropdown size="small">
<div class="dropdown">
<span>{{ $t('server.relayUse') }}</span>
<el-icon class="el-icon--right">
<ArrowDown />
</el-icon>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-if="(scope.row.AllowProtocol & 1) == 1" @click="handleConnect(scope.row.Id, 1)">TCP</el-dropdown-item>
<el-dropdown-item v-if="(scope.row.AllowProtocol & 2) == 2" @click="handleConnect(scope.row.Id, 2)">UDP</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -115,22 +140,22 @@
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import { reactive, watch,computed, onMounted, onUnmounted } from 'vue'; import { reactive, watch, computed, onMounted, onUnmounted } from 'vue';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { useConnections, useForwardConnections, useSocks5Connections, useTuntapConnections } from './connections'; import { useConnections, useForwardConnections, useSocks5Connections, useTuntapConnections } from './connections';
import { Delete } from '@element-plus/icons-vue'; import { Delete, Select, ArrowDown } from '@element-plus/icons-vue';
import { injectGlobalData } from '@/provide'; import { injectGlobalData } from '@/provide';
import { relayConnect, setRelaySubscribe } from '@/apis/relay'; import { relayConnect, setRelaySubscribe } from '@/apis/relay';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
export default { export default {
props: ['modelValue'], props: ['modelValue'],
emits: ['change','update:modelValue'], emits: ['change', 'update:modelValue'],
components: {Delete}, components: { Delete, Select, ArrowDown },
setup(props, { emit }) { setup(props, { emit }) {
const {t} = useI18n(); const { t } = useI18n();
const globalData = injectGlobalData(); const globalData = injectGlobalData();
const hasTunnelRemove = computed(()=>globalData.value.hasAccess('TunnelRemove')); const hasTunnelRemove = computed(() => globalData.value.hasAccess('TunnelRemove'));
const connections = useConnections(); const connections = useConnections();
const forwardConnections = useForwardConnections(); const forwardConnections = useForwardConnections();
@@ -138,22 +163,22 @@ export default {
const socks5Connections = useSocks5Connections(); const socks5Connections = useSocks5Connections();
const state = reactive({ const state = reactive({
show: true, show: true,
protocolTypes:{1:'tcp',2:'udp',4:'msquic'}, protocolTypes: { 1: 'tcp', 2: 'udp', 4: 'msquic' },
types:{0:'打洞',1:'中继',2:'节点'}, types: { 0: '打洞', 1: '中继', 2: '节点' },
transactions:{'forward':'端口转发','tuntap':'虚拟网卡','socks5':'代理转发'}, transactions: { 'forward': '端口转发', 'tuntap': '虚拟网卡', 'socks5': '代理转发' },
machineName:connections.value.currentName, machineName: connections.value.currentName,
currentRow:{}, currentRow: {},
data: computed(()=>{ data: computed(() => {
return [ return [
forwardConnections.value.list[connections.value.current], forwardConnections.value.list[connections.value.current],
tuntapConnections.value.list[connections.value.current], tuntapConnections.value.list[connections.value.current],
socks5Connections.value.list[connections.value.current], socks5Connections.value.list[connections.value.current],
].filter(c=>!!c); ].filter(c => !!c);
}), }),
showNodes:false, showNodes: true,
nodes:[], nodes: [],
nodesDic:{}, nodesDic: {},
timer:0 timer: 0
}); });
watch(() => state.show, (val) => { watch(() => state.show, (val) => {
if (!val) { if (!val) {
@@ -163,54 +188,55 @@ export default {
}, 300); }, 300);
} }
}); });
const handleDel = (row)=>{ const handleDel = (row) => {
if(!hasTunnelRemove.value) return; if (!hasTunnelRemove.value) return;
row.removeFunc(row.RemoteMachineId).then(()=>{ row.removeFunc(row.RemoteMachineId).then(() => {
ElMessage.success(t('common.oper')); ElMessage.success(t('common.oper'));
}).catch(()=>{}); }).catch(() => { });
} }
const _setRelaySubscribe = ()=>{ const _setRelaySubscribe = () => {
setRelaySubscribe().then((res)=>{ setRelaySubscribe().then((res) => {
state.nodes = res; state.nodes = res;
state.nodesDic = res.reduce((a,b)=>{ state.nodesDic = res.reduce((a, b) => {
a[b.Id] = b.Name; a[b.Id] = b.Name;
return a; return a;
},{}); }, {});
state.timer = setTimeout(_setRelaySubscribe,1000); state.timer = setTimeout(_setRelaySubscribe, 1000);
}).catch(()=>{ }).catch(() => {
state.timer = setTimeout(_setRelaySubscribe,1000); state.timer = setTimeout(_setRelaySubscribe, 1000);
}); });
} }
const handleNode = (row)=>{ const handleNode = (row) => {
state.currentRow = row; state.currentRow = row;
state.showNodes = true; state.showNodes = true;
} }
const handleConnect = (id)=>{ const handleConnect = (id, protocol) => {
const json = { const json = {
FromMachineId:globalData.value.config.Client.Id, FromMachineId: globalData.value.config.Client.Id,
TransactionId: state.currentRow.TransactionId, TransactionId: state.currentRow.TransactionId,
ToMachineId: state.currentRow.RemoteMachineId, ToMachineId: state.currentRow.RemoteMachineId,
NodeId:id, NodeId: id,
Protocol: protocol
}; };
if(json.NodeId == state.currentRow.NodeId){ if (json.NodeId == state.currentRow.NodeId) {
return; return;
} }
relayConnect(json).then(()=>{}).catch(()=>{}); relayConnect(json).then(() => {ElMessage.success(t('common.oper')); }).catch(() => {ElMessage.success(t('common.operFail')); });
state.showNodes = false; state.showNodes = false;
} }
onMounted(()=>{ onMounted(() => {
connections.value.updateRealTime(true); connections.value.updateRealTime(true);
_setRelaySubscribe(); _setRelaySubscribe();
}); });
onUnmounted(()=>{ onUnmounted(() => {
connections.value.updateRealTime(false); connections.value.updateRealTime(false);
clearTimeout(state.timer); clearTimeout(state.timer);
}) })
return { return {
state,handleDel,hasTunnelRemove,handleNode,handleConnect state, handleDel, hasTunnelRemove, handleNode, handleConnect
} }
} }
} }
@@ -221,4 +247,26 @@ export default {
.blue { .blue {
color: #409EFF; color: #409EFF;
} }
.dropdown{
border:1px solid #ddd;
padding:.4rem;
font-size:1.3rem;
border-radius:.4rem;
position:relative;
.el-icon{
vertical-align:middle;
}
.badge{
position:absolute;
right:-1rem;
top:-50%;
border-radius:10px;
background-color:#f1ae05;
color:#fff;
padding:.2rem .6rem;
font-size:1.2rem;
}
}
</style> </style>

View File

@@ -26,6 +26,10 @@
<el-form-item :label="$t('server.relayPublic')" prop="Public"> <el-form-item :label="$t('server.relayPublic')" prop="Public">
<el-switch v-model="state.ruleForm.Public " size="small" /> <el-switch v-model="state.ruleForm.Public " size="small" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('server.relayAllow')" prop="Allow">
<el-checkbox v-model="state.ruleForm.AllowTcp">TCP</el-checkbox>
<el-checkbox v-model="state.ruleForm.AllowUdp">UDP</el-checkbox>
</el-form-item>
<el-form-item></el-form-item> <el-form-item></el-form-item>
<el-form-item label="" prop="Btns"> <el-form-item label="" prop="Btns">
<div class="t-c w-100"> <div class="t-c w-100">
@@ -62,6 +66,8 @@ export default {
MaxGbTotalLastBytes:props.data.MaxGbTotalLastBytes, MaxGbTotalLastBytes:props.data.MaxGbTotalLastBytes,
Public:props.data.Public, Public:props.data.Public,
Url:props.data.Url, Url:props.data.Url,
AllowTcp:(props.data.AllowProtocol & 1) == 1,
AllowUdp:(props.data.AllowProtocol & 2) == 2,
}, },
rules:{ rules:{
} }
@@ -83,6 +89,8 @@ export default {
if (!valid) return; if (!valid) return;
const json = JSON.parse(JSON.stringify(state.ruleForm)); const json = JSON.parse(JSON.stringify(state.ruleForm));
json.AllowProtocol = (json.AllowTcp ? 1 : 0) | (json.AllowUdp ? 2 : 0);
relayUpdateNode(json).then((res)=>{ relayUpdateNode(json).then((res)=>{
if(res){ if(res){
ElMessage.success(t('common.oper')); ElMessage.success(t('common.oper'));

Some files were not shown because too many files have changed in this diff Show More