我认为你应该遍历这个集合并显示所有的网关,因为如果有很多网关到适配器,它们都被认为是默认的那个适配器
根据@ midspace对@caesay答案的评论,这是一个更好的答案:
public static IPAddress GetDefaultGateway() { var gateway_address = NetworkInterface.GetAllNetworkInterfaces() .Where(e => e.OperationalStatus == OperationalStatus.Up) .SelectMany(e => e.GetIPProperties().GatewayAddresses) .FirstOrDefault(); if (gateway_address == null) return null; return gateway_address.Address; }
我警告说这不是一个完整的解决方案,如果你正在寻找负责互联网访问的主界面,你应该结合其他方法,比如使用win32 API GetBestInterface 找到连接目标地址的最佳界面。
你可以在这里找到示例用法: http://www.pinvoke.net/default.aspx/iphlpapi.getbestinterface
NetworkInterface[] allNICs = NetworkInterface.GetAllNetworkInterfaces(); foreach (var nic in allNICs) { var ipProp = nic.GetIPProperties(); var gwAddresses = ipProp.GatewayAddresses; if (gwAddresses.Count > 0 && gwAddresses.FirstOrDefault(g => g.Address.AddressFamily == AddressFamily.InterNetwork) != null) { localIP = ipProp.UnicastAddresses.First(d => d.Address.AddressFamily == AddressFamily.InterNetwork).Address; } } Debug.Print(localIP.ToString());
我刚刚遇到这个并将使用以下代码 - 基本上它寻找的不是环回的接口,并且具有网关和单播地址。然后从接口I获得非瞬态IPV4地址。
public static class NetworkInterfaces { public static NetworkInterface GetDefaultInterface() { var interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(); foreach (var intf in interfaces) { if (intf.OperationalStatus != OperationalStatus.Up) { continue; } if (intf.NetworkInterfaceType == NetworkInterfaceType.Loopback) { continue; } var properties = intf.GetIPProperties(); if (properties == null) { continue; } var gateways = properties.GatewayAddresses; if ((gateways == null) || (gateways.Count == 0)) { continue; } var addresses = properties.UnicastAddresses; if ((addresses == null) || (addresses.Count == 0)) { continue; } return intf; } return null; } public static IPAddress GetDefaultIPV4Address(NetworkInterface intf) { if (intf == null) { return null; } foreach (var address in intf.GetIPProperties().UnicastAddresses) { if (address.Address.AddressFamily != AddressFamily.InterNetwork) { continue; } if (address.IsTransient) { continue; } return address.Address; } return null; } }
返回的第一个IP地址 traceroute 命令将是网关。您也可以使用此事实来获取网关。您可以找到一个很好的实现 tracerout 这里: C#中的TraceRoute和Ping
traceroute
tracerout
我知道这是一个稍微陈旧的问题,但我刚刚发现需要检索本地网关的IPV4地址。当涉及到我自己的系统时,接受的答案并不符合要求,因此,我将其修改为套件,我相信其他人也可以使用此解决方案。
由于我还没有足够的评论来评论,我不得不将其添加为“问题”:
public static IPAddress GetDefaultGateway() { IPAddress result = null; var cards = NetworkInterface.GetAllNetworkInterfaces().ToList(); if (cards.Any()) { foreach (var card in cards) { var props = card.GetIPProperties(); if (props == null) continue; var gateways = props.GatewayAddresses; if (!gateways.Any()) continue; var gateway = gateways.FirstOrDefault(g => g.Address.AddressFamily.ToString() == "InterNetwork"); if (gateway == null) continue; result = gateway.Address; break; }; } return result; }