public static string ListAllRoutes() { StringBuilder sb = new StringBuilder(); sb.AppendLine("SECTION: ROUTE PRINT"); sb.AppendLine(CallSystemCommand("PRINT -4", "route", ComponentPath.RouteExePath)); sb.AppendLine("\nSECTION: IPHLPAPI"); sb.AppendLine("\tDEST NEXT MASK INTF METRIC"); foreach (var row in IPNetHelper.GetCurrentForwardTable()) { sb.Append($"\t{new IPAddress(row.dwForwardDest).ToString().PadRight(17)}"); sb.Append(new IPAddress(row.dwForwardNextHop).ToString().PadRight(17)); sb.Append(new IPAddress(row.dwForwardMask).ToString().PadRight(17)); sb.Append(row.dwForwardIfIndex.ToString().PadRight(5)); sb.AppendLine(row.dwForwardMetric1.ToString()); } return(sb.ToString()); }
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); }