2013-08-31 15 views
7

en benim alt her ana bilgisayara bir UDP mesajı göndermek (ve sonra benim alt herhangi bir ana bilgisayardan bir UDP iletisi) istediğinizi varsayalım: Şu andaAna bilgisayarın varsayılan ağ bağdaştırıcısının yayın adresini nasıl alırsınız? C#

yapmam:

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

fakat tabiki bunun alt ağın 192.168.1/24'den farklı olması durumunda dinamik olarak yapılmasını istiyorum. Beraber denedim:

IPAddress broadcast = IPAddress.Broadcast; 

ama IPAddress.Broadcast yani ... mesajları (bir istisna atar) göndermek için kullanılamaz "255.255.255.255" temsil eder:

nasıl I do Yerel ağ adaptörü yayın adresini (veya elbette netmask) aldınız mı?

BU Sana yerel IP ve alt ağ alırsanız, hesaplamak için hiçbir sorun olmalıdır

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

Gönderdiğiniz çözüm benim için iyi çalıştı. Paqogomez'e bir cevap vermedim çünkü seninkiler direkt macun çalıştı. Kendi cevabını değiştirip kabul etmen gerekip gerekmediğini merak ediyor musun? – ScottN

cevap

5

ile geldi NİHAİ ÇÖZÜM OLDUĞU.

Böyle bir şey olabilir mi?

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? Geri kalanını size vermelisiniz.

+0

Çok iyi, cevabınız ile neredeyse hedefime ulaştım, son bir soru: Artık her arayüzün tüm ağ maskelerini sıralayabilirim. Yerel LAN ağından nasıl yararlanılır - eğer varsa! (bilgisayar doğrudan internete bağlı olabilir) –

+0

Düzenlememize göz atın. 'if (Interface.OperationalStatus! = OperationalStatus.Up) devam ederse;' Bunun arasında, ve [NetworkInterface] ile diğer çok ilginç parametreler (http://msdn.microsoft.com/en-us/library/system.net. networkinformation.networkinterface.aspx) Sahip olmalısınız. – paqogomez

+1

Kodun bazı bölümlerini (devam edenler; talimatlar) kaldırarak, doğru maskeyi elde etmeme izin veren küçük bir kod parçası ekledim. Temel olarak ana akım IP'sini Dns nesnesinden alıyorum ve sonra her bir UnicastIPAddressInformationCollection ip'siyle karşılaştırıyorum. Bir eşleşme bulduğumda ilişkili ağ maskesini döndürürüm. Bu işe yarıyor. Elbette çözümünüzü bir çözüm bulmanın temelinden beri sizinki gibi bir çözüm haline getirdim. –

İlgili konular