using System; using System.Threading.Tasks; using Netch.Utils; namespace Netch.Models { public class Server { /// /// 备注 /// public string Remark; /// /// 组 /// public string Group = "None"; /// /// 代理类型 /// public string Type; /// /// 倍率 /// public double Rate = 1.0; /// /// 地址 /// public string Hostname; /// /// 端口 /// public int Port; /// /// 延迟 /// public int Delay = -1; /// /// 获取备注 /// /// 备注 public override string ToString() { if (string.IsNullOrWhiteSpace(Remark)) { Remark = $"{Hostname}:{Port}"; } Group = Group.Equals("None") || Group.Equals("") ? "NONE" : Group; return $"[{ServerHelper.GetUtilByTypeName(Type)?.ShortName ?? "WTF"}][{Group}] {Remark}"; } /// /// 测试延迟 /// /// 延迟 public int Test() { try { var destination = DNS.Lookup(Hostname); if (destination == null) { return Delay = -2; } var list = new Task[3]; for (var i = 0; i < 3; i++) { list[i] = Task.Run(async () => { try { return await Utils.Utils.TCPingAsync(destination, Port); } catch (Exception) { return -4; } }); } Task.WaitAll(list[0], list[1], list[2]); var min = Math.Min(list[0].Result, list[1].Result); min = Math.Min(min, list[2].Result); return Delay = min; } catch (Exception) { return Delay = -4; } } } public static class ServerExtension { public static string AutoResolveHostname(this Server server) { return Global.Settings.ResolveServerHostname ? DNS.Lookup(server.Hostname).ToString() : server.Hostname; } } }