2013-08-31 38 views
7

Hãy nói rằng tôi muốn gửi một thông điệp udp để mỗi máy chủ trong subnet của tôi (và sau đó nhận được một thông udp từ bất kỳ máy chủ trong subnet của tôi):Làm thế nào để bạn nhận được địa chỉ quảng bá của máy chủ của bộ điều hợp mạng mặc định? C#

vào lúc này tôi làm:

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

nhưng tất nhiên tôi muốn điều này được thực hiện trong thực tế trong trường hợp mạng con khác với 192.168.1/24. Tôi đã thử với:

IPAddress broadcast = IPAddress.Broadcast; 

nhưng IPAddress.Broadcast đại diện cho "255.255.255.255" mà không thể được sử dụng để gửi tin nhắn (nó ném một ngoại lệ) ... như vậy:

làm cách nào để nhận địa chỉ phát sóng bộ điều hợp mạng cục bộ (hoặc netmask của khóa học)?

Đây là giải pháp cuối cùng tôi đã đưa ra

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

Giải pháp đã đăng của bạn hoạt động tốt cho tôi. Tôi đã không cung cấp cho paqogomez trả lời một đi bởi vì bạn đã làm việc dán trực tiếp. Tự hỏi liệu bạn có nên thay đổi và chấp nhận câu trả lời của riêng mình không? – ScottN

Trả lời

5

Nếu bạn nhận được IP của địa phương và subnet, nó phải là không có vấn đề để tính toán.

Điều gì đó giống như vậy?

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? Nên cung cấp cho bạn phần còn lại của nó.

+0

Rất tốt, với câu trả lời của bạn, tôi gần như đã đạt được mục tiêu của mình, một câu hỏi cuối cùng: bây giờ tôi có thể liệt kê tất cả các mặt nạ mạng của mọi giao diện. Làm thế nào để có được một trong những mạng LAN địa phương - nếu có bất kỳ! (máy tính có thể được kết nối trực tiếp với internet) –

+0

Xem bản chỉnh sửa của tôi. 'if (Interface.OperationalStatus! = OperationalStatus.Up) tiếp tục;' Giữa đó, và các tham số rất thú vị khác với [NetworkInterface] (http://msdn.microsoft.com/en-us/library/system.net. networkinformation.networkinterface.aspx) Bạn nên có nó. – paqogomez

+1

Tôi đã thêm một đoạn mã nhỏ cho phép tôi lấy mặt nạ phù hợp, xóa một số phần của mã của bạn (những mã có phần tiếp theo; hướng dẫn). Về cơ bản tôi nhận được các máy chủ hiện tại IP từ các đối tượng Dns và sau đó tôi so sánh nó với mỗi UnicastIPAddressInformationCollection ip của. Khi tôi tìm thấy kết quả phù hợp, tôi trả lại mặt nạ mạng được liên kết. Điều này dường như hoạt động. Tất nhiên tôi đặt của bạn như là giải pháp vì sự giúp đỡ của bạn là cơ bản trong việc tìm kiếm một giải pháp. –

Các vấn đề liên quan