mirror of
https://github.com/snltty/linker.git
synced 2025-10-11 20:10:25 +08:00
udp中继
This commit is contained in:
@@ -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": "",
|
||||||
|
//是否允许TCP,UDP
|
||||||
|
"AllowTcp":true,
|
||||||
|
"AllowUdp":false,
|
||||||
},
|
},
|
||||||
//我是主服务器,接收其它中继节点服务器的信息
|
//我是主服务器,接收其它中继节点服务器的信息
|
||||||
"Master": {
|
"Master": {
|
||||||
|
@@ -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];
|
||||||
|
@@ -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()
|
||||||
|
@@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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}";
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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()}");
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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>
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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; }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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; }
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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}");
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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() };
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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 服务端
|
||||||
|
|
||||||
|
@@ -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 服务端
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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>
|
||||||
/// 根据不同的消息类型做不同的事情
|
/// 根据不同的消息类型做不同的事情
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -36,7 +36,7 @@ namespace linker.messenger.sync
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.WhenAll(tasks);
|
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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>
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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>
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
@@ -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())
|
||||||
{
|
{
|
||||||
|
@@ -235,7 +235,7 @@ namespace linker.messenger.updater
|
|||||||
{
|
{
|
||||||
Connection = cache1.Connection,
|
Connection = cache1.Connection,
|
||||||
MessengerId = (ushort)UpdaterMessengerIds.Exit
|
MessengerId = (ushort)UpdaterMessengerIds.Exit
|
||||||
});
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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>
|
||||||
/// 以客户端模式接收数据
|
/// 以客户端模式接收数据
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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"/>
|
||||||
|
BIN
src/linker.route.win/dist/linker.route.win.exe
vendored
BIN
src/linker.route.win/dist/linker.route.win.exe
vendored
Binary file not shown.
@@ -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"/>
|
||||||
|
BIN
src/linker.tray.win/dist/linker.tray.win.exe
vendored
BIN
src/linker.tray.win/dist/linker.tray.win.exe
vendored
Binary file not shown.
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -35,6 +35,8 @@ namespace linker.tun
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void Shutdown();
|
public void Shutdown();
|
||||||
|
|
||||||
|
public void Refresh();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置MTU
|
/// 设置MTU
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -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
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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)
|
||||||
|
@@ -13,6 +13,7 @@ namespace linker.tunnel.connection
|
|||||||
Tcp = 1,
|
Tcp = 1,
|
||||||
Udp = 2,
|
Udp = 2,
|
||||||
Quic = 4,
|
Quic = 4,
|
||||||
|
All = 255
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 隧道模式
|
/// 隧道模式
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
|
@@ -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>
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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 _);
|
||||||
|
@@ -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++)
|
||||||
|
@@ -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',
|
||||||
|
@@ -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': '使用',
|
||||||
|
@@ -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>
|
@@ -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
Reference in New Issue
Block a user