Рассчитать широковещательный адрес по маске ip и подсети - PullRequest
18 голосов
/ 22 апреля 2009

Я хочу рассчитать широковещательный адрес для:

IP:     192.168.3.1
Subnet: 255.255.255.0
=       192.168.3.255

в кл.

Я знаю способ (делать причудливые побитовые операции ИЛИ между инвертированным IP и подсетью), но моя проблема в том, что я пришел из зеленых полей программирования MacOSX Cocoa.

Я посмотрел исходный код ipcal, но не смог интегрировать его в свою кодовую базу. Где-то в интернете должно быть просто десять строк кода, я просто не могу его найти. Может кто-нибудь указать мне короткий пример кода, как это сделать в C?

Ответы [ 5 ]

40 голосов
/ 22 апреля 2009

Просто посчитайте:

broadcast = ip | ( ~ subnet )

(Broadcast = IP-адрес или инвертированная маска подсети)

широковещательный адрес имеет бит 1, где маска подсети имеет бит 0.

5 голосов
/ 17 июля 2013

Я понимаю, что у ОП было, по крайней мере, смутное понимание арифметики на уровне битов, но он был потерян при преобразовании строк в числа и обратно. вот рабочий (с минимальным тестированием в любом случае) пример, использующий вычисления 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
3 голосов
/ 22 апреля 2009

Может ли это быть?

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

    return bcast;
}

Редактировать: я считал, что ip и подсеть без "."

1 голос
/ 14 июня 2012

Вот как это сделать в C #. например, используя ip 10.28.40.149 с маской сети 255.255.252.0, возвращает 10.28.43.255, который является правильным широковещательным адресом. благодаря некоторому коду из здесь

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();
    }
0 голосов
/ 27 ноября 2013

хорошо, кто будет искать этот код в будущем. Сегодня я трачу иногда так, как мне было нужно, вот полный код, и он работает :) Просто скопируйте и вставьте его, а затем импортируйте необходимые библиотеки.

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;

    }

Тогда просто назовите это как:

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

Удачного кодирования:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...