Calculer l'adresse de diffusion à partir du masque ip et du sous-réseau

je veux calculer l'adresse de diffusion pour:

IP:     192.168.3.1
Subnet: 255.255.255.0
=       192.168.3.255

C.

je connais le chemin (faire Fantaisie bitwise OR's entre L'IP inversée et le sous-réseau), mais mon problème est que je viens des champs verts de MACOSX Cocoa programing.

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 10 lignes de code sur internet. il. Quelqu'un pourrait-il m'indiquer un code court exemple de comment le faire en C?

15
demandé sur the Tin Man 2009-04-22 18:53:07

5 réponses

il suffit de calculer:

broadcast = ip | ( ~ subnet )

(Broadcast = ip-addr ou le masque de sous-réseau inversé)

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

37
répondu froh42 2012-11-16 23:07:32

je comprends que L'OP avait au moins une vague compréhension du bit-niveau arithmétique, mais a été perdu sur la conversion des chaînes en nombres et son inverse. voici un exemple de travail (avec des tests minimaux de toute façon), en utilisant le calcul de froh42.

jcomeau@aspire:~/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
5
répondu jcomeau_ictx 2013-07-17 04:51:08

est-ce possible?

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

    return bcast;
}

Edit: j'ai considéré que les deux ip de sous-réseau et sont sans "."

3
répondu Tom 2009-04-22 15:07:19

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 la bonne adresse de diffusion. merci à un peu de code de ici

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();
    }
1
répondu Jason Jakob 2012-06-14 17:39:47

ok qui cherchera ce code dans le futur. J'ai dépensé parfois aujourd'hui comme j'avais besoin de cela, Voici le code complet et il fonctionne :) il suffit de copier et coller et ensuite importer les dlls nécessaires.

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;

    }

alors appelez ça comme:

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

codage Heureux :)

-1
répondu Farzan Majdani 2013-11-27 09:45:24