Как определить, является ли IP из той же локальной сети программно в .NET C #
Вопрос
Я знаю, что если IP-адрес выходит за рамки правил Subnet Mask + Local IP, он будет доступен только через шлюз. Проблема в том, что я не знаю, как получить локальный IP-адрес, ни маску локальной подсети, программно используя .NET. Кто-нибудь из вас может мне помочь?
Я буду использовать эту информацию, чтобы выжать максимальную производительность из своей очереди пакетной вставки SQL. Если сервер SQL находится в той же подсети, он будет использовать алгоритм, оптимизированный для минимальной задержки, в противном случае я буду использовать алгоритм, оптимизированный для высокой задержки.
Решение
Вы можете использовать классы в пространстве имен System.Net.NetworkInformation (представлено в .NET 2.0):
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface iface in interfaces)
{
IPInterfaceProperties properties = iface.GetIPProperties();
foreach (UnicastIPAddressInformation address in properties.UnicastAddresses)
{
Console.WriteLine(
"{0} (Mask: {1})",
address.Address,
address.IPv4Mask
);
}
}
Другие советы
Существует альтернативный способ использования NetworkInformation класс:
public static void ShowNetworkInterfaces()
{
// IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
if (nics == null || nics.Length < 1)
{
Console.WriteLine(" No network interfaces found.");
return;
}
Console.WriteLine(" Number of interfaces .................... : {0}", nics.Length);
foreach (NetworkInterface adapter in nics)
{
IPInterfaceProperties properties = adapter.GetIPProperties();
Console.WriteLine();
Console.WriteLine(adapter.Description);
Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length,'='));
Console.WriteLine(" Interface type .......................... : {0}", adapter.NetworkInterfaceType);
Console.WriteLine(" Physical Address ........................ : {0}", adapter.GetPhysicalAddress().ToString());
string versions ="";
// Create a display string for the supported IP versions.
if (adapter.Supports(NetworkInterfaceComponent.IPv4))
{
versions = "IPv4";
}
if (adapter.Supports(NetworkInterfaceComponent.IPv6))
{
if (versions.Length > 0)
{
versions += " ";
}
versions += "IPv6";
}
Console.WriteLine(" IP version .............................. : {0}", versions);
UnicastIPAddressInformationCollection uniCast = properties.UnicastAddresses;
if (uniCast != null)
{
foreach (UnicastIPAddressInformation uni in uniCast)
{
Console.WriteLine(" Unicast Address ......................... : {0}", uni.Address);
Console.WriteLine(" Subnet Mask ......................... : {0}", uni.IPv4Mask);
}
}
Console.WriteLine();
}
}
Пример кода представляет собой гибридную форму примеров, предоставленных Msdn, упрощенную для отображения только той информации, которая вам, вероятно, нужна.
РЕДАКТИРОВАТЬ: Мне потребовалось слишком много времени (слишком много вещей одновременно :)), чтобы написать этот пост, и Митч победил меня:)
Это даст вам имя хоста и IP-адрес. Я предполагаю, что вы знаете IP-адреса в вашей локальной сети, поэтому вы сможете определить, находится ли IP-адрес вне локальной сети таким образом:
// Get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Using the host name, get the IP address list.
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}