using System; using System.Threading.Tasks; using Netch.Utils; using Newtonsoft.Json; namespace Netch.Models { public class Server : ICloneable { /// /// 延迟 /// [JsonIgnore] public int Delay = -1; /// /// 组 /// public string Group = "None"; /// /// 地址 /// public string Hostname; /// /// 端口 /// public ushort Port; /// /// 倍率 /// public double Rate = 1.0; /// /// 备注 /// public string Remark; /// /// 代理类型 /// public string Type; public object Clone() { return MemberwiseClone(); } /// /// 获取备注 /// /// 备注 public override string ToString() { var remark = string.IsNullOrWhiteSpace(Remark) ? $"{Hostname}:{Port}" : Remark; if (Group.Equals("None") || Group.Equals("")) Group = "NONE"; 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 Global.Settings.ServerTCPing ? await Utils.Utils.TCPingAsync(destination, Port) : Utils.Utils.ICMPing(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; } } }