2013-08-31 54 views
7

Powiedzmy, że chcę wysłać udp wiadomość do każdego hosta w moim podsieci (a następnie otrzymać udp wiadomości z dowolnego hosta w moim podsieci):Jak uzyskać adres rozgłoszeniowy hosta domyślnej karty sieciowej? C#

w tej chwili robię:

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

, ale oczywiście chcę, aby to było zrobione w sposób klasyczny w przypadku, gdy podsieć różni się od 192.168.1/24. Próbowałem z:

IPAddress broadcast = IPAddress.Broadcast; 

ale IPAddress.Broadcast reprezentuje „255.255.255.255”, które nie mogą być wykorzystywane do wysyłania wiadomości (zgłasza wyjątek) ... więc:

jak mogę uzyskać adres rozgłoszeniowy karty sieciowej (lub maskę sieci oczywiście)?

jest to rozwiązanie FINAL wymyśliłem

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

Twoje przesłane rozwiązanie działa dobrze dla mnie. Nie dałem odpowiedzi paqogomez, ponieważ twój pracował bezpośrednio. Zastanawiasz się, czy powinieneś zmienić i zaakceptować własną odpowiedź? – ScottN

Odpowiedz

5

Jeśli masz lokalną IP i podsieci, nie powinno być problemu, aby obliczyć.

Może coś takiego?

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? Powinien dać ci resztę.

+0

Bardzo dobrze, z twoją odpowiedzią prawie dotarłem do celu, ostatnie pytanie: teraz mogę wyliczyć wszystkie maski sieciowe każdego interfejsu. Jak zdobyć jedną z lokalnych sieci LAN - jeśli są jakieś! (komputer może być bezpośrednio podłączony do Internetu) –

+0

Sprawdź moją edycję. 'if (Interface.OperationalStatus! = OperationalStatus.Up) kontynuuj;' Pomiędzy tym i innymi bardzo interesującymi parametrami z [NetworkInterface] (http://msdn.microsoft.com/en-us/library/system.net. networkinformation.networkinterface.aspx) Powinieneś go mieć. – paqogomez

+1

Dodałem mały fragment kodu, który pozwala mi uzyskać odpowiednią maskę, usuwając niektóre części kodu (te z kontynuacją; instrukcja). Zasadniczo otrzymuję bieżący adres IP z obiektu Dns, a następnie porównuję go z każdym z adresów IP UnicastIPAddressInformationCollection. Gdy znajdę dopasowanie, zwracam skojarzoną z nią maskę sieci. To wydaje się działać. Oczywiście stawiam twój jako rozwiązanie, ponieważ twoja pomoc miała fundamentalne znaczenie dla znalezienia rozwiązania. –