public static NetworkInterface GetBestInterface(v4addr addr) { var ifs = (from adapter in NetworkInterface.GetAllNetworkInterfaces() where adapter.OperationalStatus == OperationalStatus.Up && adapter.Supports(NetworkInterfaceComponent.IPv4) select adapter).ToList(); NetworkInterface candidate = null; if (ifs.Count == 1) { candidate = ifs.First(); } else if (ifs.Count > 1) { // more than one running network interface string tr = CallTracert($" -d -h 1 {addr}"); var matches = Regex.Matches(tr, @"(\d{1,3}\.){3}\d{1,3}"); if (matches.Count == 2) { var targetGateway = new v4addr(matches[1].Value); Logger.Debug($"Searching for gateway {targetGateway}"); uint targetInterfaceIndex = (from row in IPNetHelper.GetCurrentForwardTable() where row.dwForwardNextHop == targetGateway.ToUInt32() select row.dwForwardIfIndex).FirstOrDefault(); candidate = ifs.FirstOrDefault(a => a.GetIPProperties().GetIPv4Properties().Index == targetInterfaceIndex); if (candidate != null) { Logger.Debug($"find interface({targetInterfaceIndex}) {candidate.Name}"); } } else { Logger.Error("Trace route error."); Logger.Debug(tr); } } return(candidate); }
protected bool Equals(v4addr other) { return(Equals(Addr, other.Addr)); }