c# - por - saber el hostname de una ip linux
¿Cómo se obtiene la dirección de difusión del host del adaptador de red predeterminado? DO# (1)
Si obtiene la IP local y la subred, no debería ser un problema calcular.
Algo como esto tal vez?
using System;
using System.Net.NetworkInformation;
public class test
{
public static void Main()
{
NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface Interface in Interfaces)
{
if(Interface.NetworkInterfaceType == NetworkInterfaceType.Loopback) continue;
if (Interface.OperationalStatus != OperationalStatus.Up) continue;
Console.WriteLine(Interface.Description);
UnicastIPAddressInformationCollection UnicastIPInfoCol = Interface.GetIPProperties().UnicastAddresses;
foreach(UnicastIPAddressInformation UnicatIPInfo in UnicastIPInfoCol)
{
Console.WriteLine("/tIP Address is {0}", UnicatIPInfo.Address);
Console.WriteLine("/tSubnet Mask is {0}", UnicatIPInfo.IPv4Mask);
}
}
}
}
¿Cómo se calcula el rango de IP cuando se proporciona la dirección IP y la máscara de red? Debería darte el resto.
Digamos que quiero enviar un mensaje udp a cada host en mi subred (y luego recibir un mensaje udp de cualquier host en mi subred):
en este momento lo hago:
IPAddress broadcast = IPAddress.Parse("192.168.1.255");
pero, por supuesto, quiero que esto se haga de forma dinámica en el caso de que la subred sea diferente de 192.168.1 / 24. Lo he intentado con:
IPAddress broadcast = IPAddress.Broadcast;
pero IPAddress.Broadcast representa "255.255.255.255" que no se puede usar para enviar mensajes (arroja una excepción) ... así que:
¿Cómo obtengo la dirección de difusión del adaptador de red local (o máscara de red, por supuesto)?
ESTA ES LA SOLUCIÓN FINAL CON LA QUE ME SUBÍ
public IPAddress getBroadcastIP()
{
IPAddress maskIP = getHostMask();
IPAddress hostIP = getHostIP();
if (maskIP==null || hostIP == null)
return null;
byte[] complementedMaskBytes = new byte[4];
byte[] broadcastIPBytes = new byte[4];
for (int i = 0; i < 4; i++)
{
complementedMaskBytes[i] = (byte) ~ (maskIP.GetAddressBytes().ElementAt(i));
broadcastIPBytes[i] = (byte) ((hostIP.GetAddressBytes().ElementAt(i))|complementedMaskBytes[i]);
}
return new IPAddress(broadcastIPBytes);
}
private IPAddress getHostMask()
{
NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface Interface in Interfaces)
{
IPAddress hostIP = getHostIP();
UnicastIPAddressInformationCollection UnicastIPInfoCol = Interface.GetIPProperties().UnicastAddresses;
foreach (UnicastIPAddressInformation UnicatIPInfo in UnicastIPInfoCol)
{
if (UnicatIPInfo.Address.ToString() == hostIP.ToString())
{
return UnicatIPInfo.IPv4Mask;
}
}
}
return null;
}
private IPAddress getHostIP()
{
foreach (IPAddress ip in (Dns.GetHostEntry(Dns.GetHostName())).AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
return ip;
}
return null;
}