Calculer l'adresse de diffusion à partir du masque ip et du sous-réseau
je veux calculer l'adresse de diffusion pour:
IP: 192.168.3.1
Subnet: 255.255.255.0
= 192.168.3.255
C.
je connais le chemin (faire Fantaisie bitwise OR's entre L'IP inversée et le sous-réseau), mais mon problème est que je viens des champs verts de MACOSX Cocoa programing.
j'ai regardé la source d'ipcal, mais je n'ai pas pu l'intégrer dans ma base de code. Il doit y avoir 10 lignes de code sur internet. il. Quelqu'un pourrait-il m'indiquer un code court exemple de comment le faire en C?
5 réponses
il suffit de calculer:
broadcast = ip | ( ~ subnet )
(Broadcast = ip-addr ou le masque de sous-réseau inversé)
l'adresse de diffusion a un bit 1
où le masque de sous-réseau a un bit 0
.
je comprends que L'OP avait au moins une vague compréhension du bit-niveau arithmétique, mais a été perdu sur la conversion des chaînes en nombres et son inverse. voici un exemple de travail (avec des tests minimaux de toute façon), en utilisant le calcul 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
est-ce possible?
unsigned broadcast(unsigned ip,unsigned subnet){
unsigned int bits = subnet ^ 0xffffffff;
unsigned int bcast = ip | bits;
return bcast;
}
Edit: j'ai considéré que les deux ip de sous-réseau et sont sans "."
Voici comment le faire en C#. par exemple, en utilisant ip 10.28.40.149 avec netmask 255.255.252.0 renvoie 10.28.43.255 qui est la bonne adresse de diffusion. merci à un peu de code de ici
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();
}
ok qui cherchera ce code dans le futur. J'ai dépensé parfois aujourd'hui comme j'avais besoin de cela, Voici le code complet et il fonctionne :) il suffit de copier et coller et ensuite importer les dlls nécessaires.
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;
}
alors appelez ça comme:
IPAddress broadcastip = CalculateBroadCastAddress(getIP(), getSubnetMask());
codage Heureux :)