2009-04-22 53 views
15

tôi muốn để tính toán địa chỉ quảng bá cho:Tính địa chỉ quảng bá từ ip và subnet mask

IP:  192.168.3.1 
Subnet: 255.255.255.0 
=  192.168.3.255 

trong C.

Tôi biết đường đi (làm Bitwise fancy OR của giữa IP đảo ngược; và subnet) , nhưng vấn đề của tôi là tôi đến từ những cánh đồng xanh của chương trình MacOSX Cocoa.

Tôi đã xem xét nguồn gốc của ipcal, nhưng không thể tích hợp nó vào cơ sở mã của tôi. Phải có mười dòng mã đơn giản ở đâu đó trên internet, tôi không thể tìm thấy nó. Ai đó có thể chỉ cho tôi một ví dụ ngắn về cách thực hiện trong C?

Trả lời

37

Chỉ cần tính toán:

broadcast = ip | (~ subnet) 

(Broadcast = ip-addr hoặc ngược subnet-mask)

Địa chỉ quảng bá có một chút 1 nơi subnet mask có một chút 0.

3

Có thể không?

unsigned broadcast(unsigned ip,unsigned subnet){ 
    unsigned int bits = subnet^0xffffffff; 
    unsigned int bcast = ip | bits; 

    return bcast; 
} 

Chỉnh sửa: Tôi cho rằng cả ip và mạng con đều không có "."

1

Đây là cách thực hiện trong C#. ví dụ bằng cách sử dụng ip 10.28.40.149 với netmask 255.255.252.0 trả về 10.28.43.255 là địa chỉ quảng bá chính xác. nhờ một số mã từ here

private static string GetBroadcastAddress(string ipAddress, string subnetMask) { 
     //determines a broadcast address from an ip and subnet 
     var ip = IPAddress.Parse(ipAddress); 
     var mask = IPAddress.Parse(subnetMask); 

     byte[] ipAdressBytes = ip.GetAddressBytes(); 
     byte[] subnetMaskBytes = mask.GetAddressBytes(); 

     if (ipAdressBytes.Length != subnetMaskBytes.Length) 
      throw new ArgumentException("Lengths of IP address and subnet mask do not match."); 

     byte[] broadcastAddress = new byte[ipAdressBytes.Length]; 
     for (int i = 0; i < broadcastAddress.Length; i++) { 
      broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i]^255)); 
     } 
     return new IPAddress(broadcastAddress).ToString(); 
    } 
5

Tôi hiểu rằng OP đã có ít nhất một sự hiểu biết mơ hồ về số học chút cấp nhưng đã bị mất trên chuyển đổi chuỗi sang số và nghịch đảo của nó. đây là một ví dụ làm việc (với thử nghiệm tối thiểu anyway), bằng cách sử dụng tính toán của froh42.

[email protected]:~/rentacoder/jcomeau/freifunk$ cat inet.c; make inet; ./inet 192.168.3.1 255.255.255.0 
#include <arpa/inet.h> 
#include <stdio.h> 
int main(int argc, char **argv) { 
    char *host_ip = argc > 1 ? argv[1] : "127.0.0.1"; 
    char *netmask = argc > 2 ? argv[2] : "255.255.255.255"; 
    struct in_addr host, mask, broadcast; 
    char broadcast_address[INET_ADDRSTRLEN]; 
    if (inet_pton(AF_INET, host_ip, &host) == 1 && 
     inet_pton(AF_INET, netmask, &mask) == 1) 
     broadcast.s_addr = host.s_addr | ~mask.s_addr; 
    else { 
     fprintf(stderr, "Failed converting strings to numbers\n"); 
     return 1; 
    } 
    if (inet_ntop(AF_INET, &broadcast, broadcast_address, INET_ADDRSTRLEN) != NULL) 
     printf("Broadcast address of %s with netmask %s is %s\n", 
      host_ip, netmask, broadcast_address); 
    else { 
     fprintf(stderr, "Failed converting number to string\n"); 
     return 1; 
    } 
    return 0; 
} 
cc  inet.c -o inet 
Broadcast address of 192.168.3.1 with netmask 255.255.255.0 is 192.168.3.255 
-1

ok ai sẽ tìm mã này trong tương lai. Tôi đã dành đôi khi ngày hôm nay khi tôi cần điều này, đây là mã đầy đủ và nó hoạt động :) chỉ cần sao chép và dán nó và sau đó nhập khẩu các dlls yêu cầu.

private IPAddress CalculateBroadCastAddress(IPAddress currentIP, IPAddress ipNetMask) 
    { 
     string[] strCurrentIP = currentIP.ToString().Split('.'); 
     string[] strIPNetMask = ipNetMask.ToString().Split('.'); 

     ArrayList arBroadCast = new ArrayList(); 

     for (int i = 0; i < 4; i++) 
     { 
      int nrBCOct = int.Parse(strCurrentIP[i]) | (int.Parse(strIPNetMask[i])^255); 
      arBroadCast.Add(nrBCOct.ToString()); 
     } 
     return IPAddress.Parse(arBroadCast[0] + "." + arBroadCast[1] + 
       "." + arBroadCast[2] + "." + arBroadCast[3]); 
    } 


    private IPAddress getIP() 
    { 
     IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); 
     foreach (IPAddress ip in host.AddressList) 
     { 
      if (ip.AddressFamily == AddressFamily.InterNetwork) 
      { 
       return ip; 

      } 
     } 
     return null; 
    } 

    private IPAddress getSubnetMask() 
    { 
     NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
     IPAddress ip = getIP(); 
     foreach (NetworkInterface interf in Interfaces) 
     { 

      UnicastIPAddressInformationCollection UnicastIPInfoCol = interf.GetIPProperties().UnicastAddresses; 

      foreach (UnicastIPAddressInformation UnicatIPInfo in UnicastIPInfoCol) 
      { 
       if (UnicatIPInfo.Address.Equals(ip)) 
        return UnicatIPInfo.IPv4Mask; 
      } 

     } 

     return null; 

    } 

Sau đó chỉ cần gọi nó thích:

IPAddress broadcastip = CalculateBroadCastAddress(getIP(), getSubnetMask()); 

Chúc mừng mã hóa :)

+2

downvoted vì đây không phải là tinh khiết C ... – PLPeeters

+0

Đây không phải là trong C – Markaos

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