Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Räkna ut nätmask

Postades av 2006-01-12 22:50:53 - Tom Granqvist, i forum c++, Tråden har 4 Kommentarer och lästs av 3969 personer

Hejsan!
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!


Svara

Sv: Räkna ut nätmask

Postades av 2006-01-12 22:57:38 - Niklas Jansson

Tyvärr vet jag inte exakt hur nätmasker fungerar.

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.


Svara

Sv:Räkna ut nätmask

Postades av 2006-01-12 23:52:02 - Tom Granqvist

En etta i nätmasken markerar en siffra i adressen som inte ändras inom ett visst subnät.
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öda


Svara

Sv: Räkna ut nätmask

Postades av 2006-01-13 11:00:26 - Daniel Sjöberg

Jag skulle göra resten så här.

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.


Svara

Sv:Räkna ut nätmask

Postades av 2006-01-18 21:09:36 - Tom Granqvist

Denna lösning borde vara korrekt enligt mina tester:

#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!


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 617
27 953
271 709
5 806
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies