2009-04-22 7 views
15

ich für die Broadcast-Adresse berechnen möchten:berechnen Broadcast-Adresse von IP-und Subnet-Mask

IP:  192.168.3.1 
Subnet: 255.255.255.0 
=  192.168.3.255 

in C.

ich die Art und Weise kennen (tun Phantasie bitweise OR ist zwischen dem inversed IP und Subnetz) , aber mein Problem ist, dass ich aus den grünen Feldern von MacOSX Cocoa programmiere.

Ich schaute in die Quelle von ipcal, war aber nicht in der Lage, es in meine Code-Basis zu integrieren. Im Internet muss es einfach zehn Zeilen Code geben, ich kann es einfach nicht finden. Könnte jemand mich auf einen kurzen Code verweisen, wie man es in C macht?

Antwort

37

einfach berechnen:

broadcast = ip | (~ subnet) 

(Broadcast-= ip-addr oder der invertierte Subnetz-Maske)

Die Broadcast-Adresse hat einen 1 Bit in dem die Subnetz-Maske einen 0 Bit hat.

3

Könnte es sein?

Edit: Ich dachte, dass sowohl IP und Subnetz ohne "."

1

Hier ist, wie es in C# zu tun. Zum Beispiel gibt die Verwendung von ip 10.28.40.149 mit der Netzmaske 255.255.252.0 10.28.43.255 zurück, was die korrekte Broadcast-Adresse ist. dank einiger Code aus 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

Ich verstehe, dass die OP zumindest eine vage Verständnis der Bit-Level-Arithmetik hatte, wurde aber auf die Umwandlung der Strings in Zahlen und ihre Inverse verloren. Hier ist ein funktionierendes Beispiel (mit minimalem Test), das die Berechnung von froh42 verwendet.

[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 wen wird dieser Code in der Zukunft suchen. Ich habe heute manchmal so gebraucht wie ich das gebraucht habe, hier ist der komplette Code und es funktioniert :) Einfach kopieren und einfügen und dann die benötigten DLLs importieren.

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; 

    } 

Dann nenne es einfach mag:

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

Glücklich Codierung :)

+2

Downvoted weil diese C nicht rein ... – PLPeeters

+0

Dies ist nicht in C – Markaos