Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从ip和子网掩码计算广播地址_C_Ip_Broadcast_Subnet - Fatal编程技术网

C 从ip和子网掩码计算广播地址

C 从ip和子网掩码计算广播地址,c,ip,broadcast,subnet,C,Ip,Broadcast,Subnet,我要计算以下各项的广播地址: IP: 192.168.3.1 Subnet: 255.255.255.0 = 192.168.3.255 在C 我知道这条路(在反向IP和子网之间做奇妙的按位OR),但我的问题是我来自MacOSX Cocoa编程的绿色领域 我查看了ipcal的源代码,但未能将其集成到我的代码库中。互联网上一定有十行简单的代码,我就是找不到。 有人能给我举一个简短的代码示例,说明如何在C语言中实现这一点吗?只需计算一下: broadcast = ip | (

我要计算以下各项的广播地址:

IP:     192.168.3.1
Subnet: 255.255.255.0
=       192.168.3.255
在C

我知道这条路(在反向IP和子网之间做奇妙的按位OR),但我的问题是我来自MacOSX Cocoa编程的绿色领域

我查看了ipcal的源代码,但未能将其集成到我的代码库中。互联网上一定有十行简单的代码,我就是找不到。 有人能给我举一个简短的代码示例,说明如何在C语言中实现这一点吗?

只需计算一下:

broadcast = ip | ( ~ subnet )
(广播=ip地址或反向子网掩码)

广播地址有一个
1
位,而子网掩码有一个
0
位。

可能是吗

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

    return bcast;
}
编辑:我认为ip和子网都没有“.”

以下是如何在C#中做到这一点。例如,将ip 10.28.40.149与网络掩码255.255.252.0一起使用会返回10.28.43.255,这是正确的广播地址。多亏了来自

私有静态字符串GetBroadcastAddress(字符串ipAddress,字符串子网掩码){
//从ip和子网确定广播地址
var ip=IPAddress.Parse(IPAddress);
var mask=IPAddress.Parse(子网掩码);
字节[]ipAdressBytes=ip.GetAddressBytes();
byte[]subnetMaskBytes=mask.GetAddressBytes();
if(ipAdressBytes.Length!=subnetMaskBytes.Length)
抛出新ArgumentException(“IP地址和子网掩码的长度不匹配”);
byte[]broadcastAddress=新字节[ipAdressBytes.Length];
for(int i=0;i
据我所知,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
jcomeau@aspire:~/rentacoder/jcomeau/freifunk$cat inet.c;制作inet/inet 192.168.3.1 255.255.255.0
#包括
#包括
int main(int argc,字符**argv){
char*host_ip=argc>1?argv[1]:“127.0.0.1”;
char*netmask=argc>2?argv[2]:“255.255.255.255”;
结构地址主机、掩码、广播;
字符广播地址[INET_ADDRSTRLEN];
if(inet\u pton(AF\u inet、host\u ip和host)==1&&
inet\u pton(AF\u inet、网络掩码和掩码)==1)
broadcast.s_addr=host.s_addr | ~mask.s_addr;
否则{
fprintf(stderr,“将字符串转换为数字失败\n”);
返回1;
}
if(inet\u ntop(AF\u inet,&broadcast,broadcast\u地址,inet\u ADDRSTRLEN)!=NULL)
printf(“网络掩码为%s的%s的广播地址为%s\n”,
主机ip、网络掩码、广播地址);
否则{
fprintf(stderr,“将数字转换为字符串失败\n”);
返回1;
}
返回0;
}
cc inet.c-o inet
网络掩码为255.255.255.0的192.168.3.1的广播地址为192.168.3.255

好的,将来谁来查找此代码。我今天花了一些时间,因为我需要这个,这里是完整的代码,它可以工作:)只需复制和粘贴它,然后导入所需的DLL

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;

    }

快乐编码:)

这不是C语言
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());