2009-04-22 20 views
15

Chcę obliczyć adres rozgłoszeniowy dla:Oblicz transmitowany adres z ip i maski podsieci

IP:  192.168.3.1 
Subnet: 255.255.255.0 
=  192.168.3.255 

w C.

Znam drogę (robi fantazyjny bitowym OR pomiędzy jednostkami odwróconej IP i podsieci) , ale moim problemem jest to, że pochodzę z zielonych pól programowania MacOSX Cocoa.

Sprawdziłem źródło ipcal, ale nie byłem w stanie zintegrować go z bazą kodu. Musi istnieć proste dziesięć linii kodu gdzieś w Internecie, po prostu nie mogę go znaleźć. Czy ktoś może wskazać mi krótki przykład kodu, jak to zrobić w C?

Odpowiedz

37

Wystarczy obliczyć:

broadcast = ip | (~ subnet) 

(Broadcast = ip-addr lub odwrócony-maska ​​podsieci)

Adres broadcast ma 1 trochę gdzie maska ​​podsieci ma 0 trochę.

3

Czy to możliwe?

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

    return bcast; 
} 

Edycja: Rozważyłem, że zarówno ip, jak i podsieć są bez "."

1

Oto jak to zrobić w języku C#. na przykład przy użyciu ip 10.28.40.149 z maską sieci 255.255.252.0 zwraca 10.28.43.255, który jest poprawnym adresem rozgłoszeniowym. Dzięki pewnym kodem z 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

Rozumiem, że PO miała przynajmniej mgliste rozumienie arytmetyki nieco szczebla ale zaginął na konwertowanie ciągi do liczb i jej odwrotności. oto przykład pracy (z minimalnym testowaniem w każdym razie), z wykorzystaniem kalkulacji 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, kto będzie szukał tego kodu w przyszłości. Spędziłem czasem tak, jak tego potrzebowałem, tutaj jest pełny kod i działa :) po prostu skopiuj i wklej, a następnie zaimportuj wymagane biblioteki dll.

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; 

    } 

Następnie wystarczy zadzwonić podoba:

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

Szczęśliwy kodowania :)

+2

downvoted bo to nie jest czystym C ... – PLPeeters

+0

To nie jest w C – Markaos