2009-04-22 18 views
15

Je veux calculer l'adresse de diffusion:Calculer l'adresse de diffusion de IP et le masque sous-réseau

IP:  192.168.3.1 
Subnet: 255.255.255.0 
=  192.168.3.255 

en C.

Je connais le chemin (faire de fantaisie au niveau du bit ou celui entre l'IP inversée et sous-réseau) , mais mon problème est que je viens des champs verts de la programmation MacOSX Cocoa. J'ai regardé la source d'ipcal, mais je n'ai pas pu l'intégrer dans ma base de code. Il doit y avoir un simple dix lignes de code quelque part sur Internet, je ne peux pas le trouver. Quelqu'un pourrait-il me diriger vers un exemple de code court de la façon de le faire en C?

Répondre

37

Il suffit de calculer:

broadcast = ip | (~ subnet) 

(diffusion = ip-ou sous-réseau inversé masque)

L'adresse de diffusion a un peu où le masque de sous-réseau 1 a un peu 0.

3

Pourrait-il être? Edit: J'ai considéré que les deux ip et sous-réseau sont sans "."

1

Voici comment le faire en C#. par exemple en utilisant ip 10.28.40.149 avec netmask 255.255.252.0 renvoie 10.28.43.255 qui est l'adresse de diffusion correcte. grâce à un code de 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

Je comprends que l'OP avait au moins une vague idée de l'arithmétique au niveau du bit, mais a été perdu sur la conversion des chaînes en nombres et son inverse. Voici un exemple de travail (avec un minimum de tests de toute façon), en utilisant le calcul de 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 qui cherchera ce code dans le futur. J'ai dépensé parfois aujourd'hui comme j'avais besoin de ceci, voici le code complet et cela fonctionne :) simplement le copier et le coller et puis importer les dlls requis.

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; 

    } 

Puis simplement l'appeler comme:

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

:) Bonne programmation

+2

downvoted parce que ce n'est pas pur C ... – PLPeeters

+0

Ce n'est pas en C – Markaos