mirror of
https://github.com/snltty/linker.git
synced 2025-10-08 02:20:15 +08:00
78 lines
2.8 KiB
C#
78 lines
2.8 KiB
C#
using linker.config;
|
|
using linker.libs;
|
|
using linker.plugins.client;
|
|
using linker.plugins.relay.client.transport;
|
|
using System.Net;
|
|
using System.Net.NetworkInformation;
|
|
|
|
namespace linker.plugins.relay.client
|
|
{
|
|
/// <summary>
|
|
/// 中继
|
|
/// </summary>
|
|
public sealed class RelayTestTransfer
|
|
{
|
|
private readonly RelayTransfer relayTransfer;
|
|
private readonly ClientSignInState clientSignInState;
|
|
private readonly ClientConfigTransfer clientConfigTransfer;
|
|
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
|
|
|
public List<RelayNodeReportInfo> Nodes { get; private set; } = new List<RelayNodeReportInfo>();
|
|
|
|
public RelayTestTransfer( RelayTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
|
|
{
|
|
this.relayTransfer = relayTransfer;
|
|
this.clientSignInState = clientSignInState;
|
|
this.clientConfigTransfer = clientConfigTransfer;
|
|
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
|
|
|
TestTask();
|
|
}
|
|
|
|
|
|
private readonly LastTicksManager lastTicksManager = new LastTicksManager();
|
|
public void Subscribe()
|
|
{
|
|
lastTicksManager.Update();
|
|
}
|
|
private async Task TaskRelay()
|
|
{
|
|
try
|
|
{
|
|
ITransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == relayClientConfigTransfer.Server.RelayType);
|
|
if (transport != null)
|
|
{
|
|
Nodes = await transport.RelayTestAsync(new RelayTestInfo
|
|
{
|
|
MachineId = clientConfigTransfer.Id,
|
|
SecretKey = relayClientConfigTransfer.Server.SecretKey
|
|
});
|
|
var tasks = Nodes.Select(async (c) =>
|
|
{
|
|
IPEndPoint ep = c.EndPoint == null || c.EndPoint.Address.Equals(IPAddress.Any) ? clientSignInState.Connection.Address : c.EndPoint;
|
|
|
|
using Ping ping = new Ping();
|
|
var resp = await ping.SendPingAsync(ep.Address, 1000);
|
|
c.Delay = resp.Status == IPStatus.Success ? (int)resp.RoundtripTime : -1;
|
|
});
|
|
await Task.WhenAll(tasks);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
private void TestTask()
|
|
{
|
|
TimerHelper.SetInterval(async () =>
|
|
{
|
|
if (lastTicksManager.DiffLessEqual(3000))
|
|
{
|
|
await TaskRelay();
|
|
}
|
|
return true;
|
|
}, () => 3000);
|
|
}
|
|
|
|
}
|
|
} |