web-dev-qa-db-ja.com

IPとサブネットマスクからブロードキャストアドレスを計算する

ブロードキャストアドレスを計算したい:

IP:     192.168.3.1
Subnet: 255.255.255.0
=       192.168.3.255

cで.

私は方法を知っていますが(逆IPとサブネット間でビットごとのORを行っています)、私の問題はMacOSX Cocoaプログラミングのグリーンフィールドに由来しています。

Ipcalのソースを調べましたが、コードベースに統合できませんでした。インターネットのどこかに単純な10行のコードがあるはずですが、見つかりません。誰かが私にCでそれを行う方法の短いコード例を教えてもらえますか?

18
Kolja

計算するだけです:

broadcast = ip | ( ~ subnet )

(ブロードキャスト= ip-addrまたは逆サブネットマスク)

ブロードキャストアドレスには1ビット、サブネットマスクには0ビット。

40
froh42

OPはビットレベル演算について少なくとも漠然と理解していましたが、文字列を数値およびその逆に変換することで失われていたことを理解しています。以下は、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
jcomeau_ictx

それは可能性が?

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

    return bcast;
}

編集:ipとサブネットの両方に "。"がないと考えました。

3
Tom

これは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();
    }
1
Jason Jakob