2013-08-31 15 views
7

Diciamo che voglio inviare un messaggio UDP per ogni host nel mio sottorete (e quindi ricevere un messaggio UDP da qualsiasi host nella mia sottorete):Come si ottiene l'indirizzo di broadcast dell'host dell'adattatore di rete predefinito? C#

in questo momento faccio:

IPAddress broadcast = IPAddress.Parse("192.168.1.255"); 

ma ovviamente voglio che questo venga fatto dinamicamente nel caso in cui la sottorete sia diversa da 192.168.1/24. Ho provato con:

IPAddress broadcast = IPAddress.Broadcast; 

ma IPAddress.Broadcast rappresenta "255.255.255.255" che non possono essere utilizzati per inviare messaggi (viene generata un'eccezione) ... quindi:

Come faccio ottenere l'indirizzo di trasmissione dell'adattatore di rete locale (o la maschera di rete, ovviamente)?

QUESTA è la soluzione finale mi si avvicinò con

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; 
} 
+1

La soluzione pubblicata ha funzionato bene per me. Non ho dato una risposta a paqogomez perché il tuo ha funzionato direttamente. Ti chiedi se dovresti cambiare e accettare la tua risposta? – ScottN

risposta

5

Se si ottiene l'IP locale e sottorete, si dovrebbe essere un problema per il calcolo.

Qualcosa di simile forse?

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); 
      } 
     } 
    } 
} 

How to calculate the IP range when the IP address and the netmask is given? Deve darti il ​​resto.

+0

Molto bene, con la tua risposta ho quasi raggiunto il mio obiettivo, un'ultima domanda: ora posso enumerare tutte le maschere di rete di ogni interfaccia. Come ottenere quello della rete LAN locale - se ce n'è! (il computer può essere collegato direttamente a Internet) –

+0

Controlla la mia modifica. 'if (Interface.OperationalStatus! = OperationalStatus.Up) continua;' Tra questo e altri parametri molto interessanti con [NetworkInterface] (http://msdn.microsoft.com/en-us/library/system.net. networkinformation.networkinterface.aspx) Dovresti averlo. – paqogomez

+1

Ho aggiunto un piccolo pezzo di codice che mi permette di ottenere la maschera giusta, rimuovendo alcune parti del codice (quelle con continue istruzioni). Fondamentalmente ottengo l'IP corrente dell'host dall'oggetto Dns e poi lo confronto con ogni IP di UnicastIPAddressInformationCollection. Quando trovo una corrispondenza, restituisco la maschera di rete associata. Questo sembra funzionare. Certo che ho messo la tua come soluzione in quanto il tuo aiuto è stato fondamentale per trovare una soluzione. –