Hejsan! Tyvärr vet jag inte exakt hur nätmasker fungerar. En etta i nätmasken markerar en siffra i adressen som inte ändras inom ett visst subnät. Jag skulle göra resten så här. Denna lösning borde vara korrekt enligt mina tester:Räkna ut nätmask
Ska göra ett program som räknar ut den minsta gemensamma nätmasken för två ip-adresser men behöver lite hjälp. Adresserna hårdkodas i programmet som integer-variabler enligt:
<code>
(första byten * 256^3) + (andra byten * 256^2) + * (tredje byten * 256) + fjärde byten.
</code>
Jag xor:ar de två adresserna med varandra för att få ut skillnaden men sen sitter jag fast...
#include <stdio.h>
int main(int argc, char* argv){
unsigned int ip1 = 1356664365; //80.221.14.45
unsigned int ip2 = 1356664372; //80.221.14.52
unsigned int res, tmp;
// XORa
tmp = ip1 ^ ip2;
printf("ip1 ^ ip2: %d\n", tmp);
Så långt stämmer det bra, skiljer på fem LSb. Men hur skall jag göra för att få den nya subnätmasken?
Måste ju fylla en 32-bitars variabel med (32 - antal felande LSb) ettor och plussa till (antal felande LSb) nollor...
"Råddar" säkert till det i onödan, skulle uppskatta hjälp!
Sv: Räkna ut nätmask
Så vitt jag kan förstå så borde det fungera enligt att man har ett antal "bitar", en "bit" kan ha tre värden, 1, 0, eller valfritt?
Eller behåller man bara alla 1:or?
Förklara lite noggrannare ska det nog inte vara några problem.Sv:Räkna ut nätmask
t.ex:
<code>
IP: 80.221.14.52
nätmask: 255.255.248.0
binärt(bara två sista byten): 11111000.00000000
</code>
betycer att man kan ha 2^11 - 2 datorer i nätet. Det mittprogram ska räkna ut är alltså hur många datorer nätet minst måste stödaSv: Räkna ut nätmask
Du har diffen mellan adresserna (säg 511) det du nu letar fram är nästa högre tal som endast ger en binär etta och resten nollor. (alltså 512 eller 1000000000). Du fyller på med etter i början av denna så att du får 32 bitar. Sedan är det bara att presentera den. 255.255.254.0
for (int i=1,int b=2;i< 32;i++)
{
if b < tmp
{
b *= 2;
}
}
for (int fill = 32; fill >= i; fill--)
{
printf("1");
}
Och så fyller du på med i-1 nollor.Sv:Räkna ut nätmask
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MSB 0x80000000
unsigned int ip2int(char ip[]);
void int2ip(char *ip, unsigned int bip);
int main(int argc, char* argv[]){
unsigned int ip1, ip2, res;
unsigned int netmask = 0xFFFFFFFF; //255.255.255.255
char buf[20];
int i=0;
if (argc < 3) {
puts("Anvendning: ip.exe ip1 ip2");
return 0;
}
ip1 = ip2int(argv[1]);
ip2 = ip2int(argv[2]);
if (ip1 == ip2) {
printf("Adresserna e lika!!");
return 0;
}
printf("Numerisk ip1: %u, ip2: %u\n", ip1, ip2);
/* Maska ut MSB för båda adresserna, gör XOR på det,
* - om noll: vänsterskifta adresserna och räkna upp i.
* - om ett: bitarna är olika, hoppa ut.
* Vänsterskifta fulla nätmasken med (32 - i) för att få
* den riktiga nätmasken.
*/
while(1){
res = ((ip1 & MSB) ^ (ip2 & MSB));
if(res) break; // bitarna olika, hoppa ut.
i++;
ip1 <<= 1;
ip2 <<= 1;
};
//printf("%u", netmask);
int2ip(buf, netmask << (32-i));
printf("Netmask: %s\n", buf);
return 1;
}
/* omvandla från "punktnotation" till integer:
* (första byten * 256^3) + (andra byten * 256^2) +
* (tredje byten * 256) + fjärde byten
*/
unsigned int ip2int(char ip[]){
unsigned int res, tmp;
//första byten
tmp = atoi(strtok(ip, "."));
res = (tmp * pow(256,3));
//andra byten
tmp = atoi(strtok(NULL, "."));
res += (tmp * pow(256,2));
//tredje
res += atoi(strtok(NULL, ".")) * 256;
//fjärde
res += atoi(strtok(NULL, "."));
return res;
}
/* Från integer till punktnotation */
void int2ip(char* ip, unsigned int bip){
sprintf(ip, "%d.%d.%d.%d", (bip & 0xFF000000) >> 24,
(bip & 0x00FF0000) >> 16,
(bip & 0x0000FF00) >> 8,
(bip & 0x000000FF));
}
där är också kod som omvandlarip från "punktnotation" till numerisk!