Пример #1
0
        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);
        }
Пример #2
0
 protected bool Equals(v4addr other)
 {
     return(Equals(Addr, other.Addr));
 }