* UDP Test

Increases UDP test timeout

Pref exception

Fix

Add Minecraft Bedrock Edition Test

* Optimization

* Refactor

* Rename
This commit is contained in:
DHR60
2026-04-25 02:45:45 +00:00
committed by GitHub
parent ee6ae3d91d
commit 0af29f50c0
35 changed files with 1117 additions and 30 deletions
@@ -161,6 +161,11 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
listen = Global.Loopback,
port = port,
protocol = EInboundProtocol.mixed.ToString(),
settings = new Inboundsettings4Ray()
{
udp = true,
auth = "noauth"
},
};
inbound.tag = inbound.protocol + inbound.port.ToString();
_coreConfig.inbounds.Add(inbound);
@@ -256,6 +261,11 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
listen = Global.Loopback,
port = port,
protocol = EInboundProtocol.mixed.ToString(),
settings = new Inboundsettings4Ray()
{
udp = true,
auth = "noauth"
},
});
_coreConfig.routing.rules.Add(BuildFinalRule());
@@ -1,3 +1,5 @@
using ServiceLib.UdpTest;
namespace ServiceLib.Services;
public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateFunc)
@@ -49,6 +51,10 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
await RunRealPingBatchAsync(lstSelected, exitLoopKey);
break;
case ESpeedActionType.UdpTest:
await RunUdpTestBatchAsync(lstSelected, exitLoopKey);
break;
case ESpeedActionType.Speedtest:
await RunMixedTestAsync(lstSelected, 1, true, exitLoopKey);
break;
@@ -101,6 +107,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
{
case ESpeedActionType.Tcping:
case ESpeedActionType.Realping:
case ESpeedActionType.UdpTest:
await UpdateFunc(it.IndexId, ResUI.Speedtesting, "");
ProfileExManager.Instance.SetTestDelay(it.IndexId, 0);
break;
@@ -238,6 +245,86 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
return true;
}
private async Task RunUdpTestBatchAsync(List<ServerTestItem> lstSelected, string exitLoopKey, int pageSize = 0)
{
if (pageSize <= 0)
{
pageSize = lstSelected.Count < Global.SpeedTestPageSize ? lstSelected.Count : Global.SpeedTestPageSize;
}
var lstTest = GetTestBatchItem(lstSelected, pageSize);
List<ServerTestItem> lstFailed = new();
foreach (var lst in lstTest)
{
var ret = await RunUdpTestAsync(lst, exitLoopKey);
if (ret == false)
{
lstFailed.AddRange(lst);
}
await Task.Delay(100);
}
//Retest the failed part
if (lstFailed.Count > 0)
{
if (ShouldStopTest(exitLoopKey))
{
await UpdateFunc("", ResUI.SpeedtestingSkip);
return;
}
await UpdateFunc("", string.Format(ResUI.SpeedtestingTestFailedPart, lstFailed.Count));
await RunUdpTestAsync(lstFailed, exitLoopKey);
}
}
private async Task<bool> RunUdpTestAsync(List<ServerTestItem> selecteds, string exitLoopKey)
{
ProcessService processService = null;
try
{
processService = await CoreManager.Instance.LoadCoreConfigSpeedtest(selecteds);
if (processService is null)
{
return false;
}
await Task.Delay(1000);
List<Task> tasks = new();
foreach (var it in selecteds)
{
if (!it.AllowTest)
{
continue;
}
if (ShouldStopTest(exitLoopKey))
{
return false;
}
tasks.Add(Task.Run(async () =>
{
await DoUdpTest(it);
}));
}
await Task.WhenAll(tasks);
}
catch (Exception ex)
{
Logging.SaveLog(_tag, ex);
}
finally
{
if (processService != null)
{
await processService?.StopAsync();
}
}
return true;
}
private async Task RunMixedTestAsync(List<ServerTestItem> selecteds, int concurrencyCount, bool blSpeedTest, string exitLoopKey)
{
using var concurrencySemaphore = new SemaphoreSlim(concurrencyCount);
@@ -330,6 +417,24 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
});
}
private async Task<int> DoUdpTest(ServerTestItem it)
{
var udpService = UdpTestService.CreateFromTarget(_config?.SpeedTestItem.UdpTestTarget, out var udpTestUrl);
var responseTime = -1;
try
{
responseTime = (int)(await udpService.SendUdpRequestAsync(udpTestUrl, it.Port, TimeSpan.FromSeconds(5))).TotalMilliseconds;
}
catch
{
// ignored
}
ProfileExManager.Instance.SetTestDelay(it.IndexId, responseTime);
await UpdateFunc(it.IndexId, responseTime.ToString());
return responseTime;
}
private async Task<int> GetTcpingTime(string url, int port)
{
var responseTime = -1;