mirror of
https://github.com/2dust/v2rayN.git
synced 2026-10-14 17:25:03 +03:00
UDP Test (#8999)
* UDP Test Increases UDP test timeout Pref exception Fix Add Minecraft Bedrock Edition Test * Optimization * Refactor * Rename
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user