从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 ) 

(Broadcast = ip-addr或反向子网掩码)

广播地址具有1位,其中子网掩码具有0位。

我知道OP至少对位级算术有一个模糊的理解,但在将字符串转换为数字及其反转时丢失了。 这是一个工作(无论如何最小的测试)的例子,使用froh42的计算。

 jcomeau@aspire:~/rentacoder/jcomeau/freifunk$ cat inet.c; make inet; ./inet 192.168.3.1 255.255.255.0 #include  #include  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 

可能吗?

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

编辑:我认为ip和子网都没有“。”

以下是如何在C#中完成的。 例如,使用带有网络掩码255.255.252.0的ip 10.28.40.149返回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(); } 

好的,谁将来会寻找这个代码。 我今天有时花费我需要这个,这里是完整的代码,它的工作原理:)只需复制并粘贴它,然后导入所需的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; } 

然后就像这样称呼它:

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

快乐编码:)