subredes - Calcular la dirección de difusión desde la máscara de IP y subred
como calcular subredes de una direccion ip (5)
¿Podría ser?
unsigned broadcast(unsigned ip,unsigned subnet){
unsigned int bits = subnet ^ 0xffffffff;
unsigned int bcast = ip | bits;
return bcast;
}
Edición: consideré que tanto la ip como la subred están sin "."
Quiero calcular la dirección de transmisión para:
IP: 192.168.3.1
Subnet: 255.255.255.0
= 192.168.3.255
Cía.
Conozco la forma (haciendo OR extraños en modo bit a bit entre la IP invertida y la subred), pero mi problema es que vengo de los campos verdes de la programación MacOSX Cocoa.
Busqué en la fuente de ipcal, pero no pude integrarla en mi base de código. Debe haber un simple diez líneas de código en algún lugar de Internet, simplemente no puedo encontrarlo. ¿Podría alguien indicarme un ejemplo de código corto de cómo hacerlo en C?
Aquí es cómo hacerlo en C #. por ejemplo, usar ip 10.28.40.149 con máscara de red 255.255.252.0 devuelve 10.28.43.255, que es la dirección de transmisión correcta. gracias a un código de here
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();
}
Entiendo que el OP tenía al menos una vaga comprensión de la aritmética de nivel de bits, pero se perdió al convertir las cadenas en números y su inverso. Aquí hay un ejemplo de trabajo (con pruebas mínimas de todos modos), utilizando el cálculo 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
Sólo calcula:
broadcast = ip | ( ~ subnet )
(Difusión = ip-addr o la máscara de subred invertida)
La dirección de transmisión tiene un bit 1
donde la máscara de subred tiene un bit 0
.
ok quien buscará este código en el futuro. He gastado algunas veces hoy, ya que necesitaba esto, aquí está el código completo y funciona :) simplemente cópielo y péguelo y luego importe los archivos DLL necesarios.
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;
}
Entonces solo llámalo como
IPAddress broadcastip = CalculateBroadCastAddress(getIP(), getSubnetMask());
Feliz codificacion :)