我们都知道PC可以有一个或多个网络接口。每个网络接口可以有一个或两个(可能更多)的IP地址。问题是如何确定将使用哪个IP地址与远程主机通信。
我知道如何使用下一个代码获取网络接口(感谢来自pinvoke.net的人):
private static NetworkInterface GetNetworkInterfaceByIndex(uint index)
{
// Search in all network interfaces that support IPv4.
NetworkInterface ipv4Interface = (from thisInterface in NetworkInterface.GetAllNetworkInterfaces()
where thisInterface.Supports(NetworkInterfaceComponent.IPv4)
let ipv4Properties = thisInterface.GetIPProperties().GetIPv4Properties()
where ipv4Properties != null && ipv4Properties.Index == index
select thisInterface).SingleOrDefault();
if (ipv4Interface != null)
return ipv4Interface;
// Search in all network interfaces that support IPv6.
NetworkInterface ipv6Interface = (from thisInterface in NetworkInterface.GetAllNetworkInterfaces()
where thisInterface.Supports(NetworkInterfaceComponent.IPv6)
let ipv6Properties = thisInterface.GetIPProperties().GetIPv6Properties()
where ipv6Properties != null && ipv6Properties.Index == index
select thisInterface).SingleOrDefault();
return ipv6Interface;
}
[DllImport("iphlpapi.dll", SetLastError = true)]
static extern int GetBestInterface(uint DestAddr, out uint BestIfIndex);
static void IpAddressLogTest()
{
Console.Write("Enter IP address to choose interface: ");
IPAddress addr;
IPAddress.TryParse(Console.ReadLine(), out addr);
uint bestintf;
var res = GetBestInterface(BitConverter.ToUInt32(addr.GetAddressBytes(), 0), out bestintf);
NetworkInterface interfaceInfo = GetNetworkInterfaceByIndex(bestintf);
foreach (var a in interfaceInfo.GetIPProperties().UnicastAddresses)
if (a.Address.AddressFamily == AddressFamily.InterNetwork)
Console.WriteLine(a.Address.ToString());
Console.ReadLine();
}
此代码完美运行,我知道将使用哪个接口与主机通信。但是接口可以在不同的网络中有两个IP地址。
在这种情况下如何选择正确的IP地址?
UPD1。此类设置的示例: