2013-08-31 47 views
7

比方說,我想在我的子網發送一個UDP報文到每個主機(然後從我的子網中的主機收到UDP報文):此刻如何獲取默認網絡適配器的主機廣播地址? C#

我做的:

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

但我當然希望在子網不同於192.168.1/24的情況下進行此操作。我試着:

IPAddress broadcast = IPAddress.Broadcast; 

但IPAddress.Broadcast表示不能被用來發送消息(它拋出一個異常)「255.255.255.255」 ......這樣:

我該怎麼辦獲取本地網絡適配器的廣播地址(或者當然是網絡掩碼)?

這是最後的解決方案,我想出了

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

您發佈的解決方案適合我。我沒有給paqogomez答案,因爲你的直接粘貼。想知道你是否應該改變並接受你自己的答案? – ScottN

回答

5

如果你的本地IP和子網,它應該是計算沒有問題。

也許這樣的事情?

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?應該給你剩下的。

+0

很好,你的回答幾乎達到了我的目標,最後一個問題:現在我可以枚舉每個接口的所有網絡掩碼。如何獲得本地局域網的一個 - 如果有的話! (電腦可能直接連接到互聯網) –

+0

看看我的編輯。 'if(Interface.OperationalStatus!= OperationalStatus.Up)continue;'在[NetworkInterface](http://msdn.microsoft.com/en-us/library/system.net。)和其他非常有趣的參數之間。 networkinformation.networkinterface.aspx)你應該擁有它。 – paqogomez

+1

我添加了一小段代碼,可以讓我獲得正確的掩碼,刪除代碼的某些部分(帶有continue; instruction的部分)。基本上我從Dns對象獲取主機當前IP,然後將其與每個UnicastIPAddressInformationCollection IP進行比較。當我找到一個匹配時,我返回關聯的網絡掩碼。這似乎工作。當然,我把你的解決方案作爲解決方案,因爲你的幫助是找到解決方案的基礎。 –

相關問題