Προς το περιεχόμενο

Πρόγραμμα C σχετικά με IP και subnet mask


@kon_!

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα παίδες.Πρέπει να έχω μέχρι αύριο στις 5 έτοιμη μια εργασία.Σας παρακαλώ αν είναι εύκολο να με βοηθήσετε.Η εκφώνηση έιναι η εξής:

 

Α) Η διευθυνσιοδότηση του πρωτοκόλλου IPv4 ορίζει την ύπαρξη τεσσάρων κλάσεων διευθύνσεων Α, B, C , D. Κάθε διεύθυνση διαφορετικής κλάσης ξεκινάει με διαφορετικό δυαδικό πρόθεμα προκειμένου να είναι εύκολη και γρήγορη η διαδικασία αναγνώρισης της κλάσης από τους δρομολογητές του διαδικτύου.

Στην εργασία αυτή θα πρέπει να κατασκευάσετε ένα πρόγραμμα το οποίο θα δέχεται ως είσοδο μια διεύθυνση IP σε dotted decimal μορφή και θα δίνει ως έξοδο:

o Τη κλάση στην οποία ανήκει η διεύθυνση αυτή (A-D).

o Τη διεύθυνση δικτύου (network address) σε δυαδική, dotted decimal και δεκαεξαδική μορφή

o Τη διεύθυνση κόμβου (host address) σε δυαδική, dotted decimal και δεκαεξαδική μορφή.

 

 

Β) Η χρήση της τεχνικές της μάσκας υποδικτύου στοχεύει στο να μειώσει την υποχρησιμοποίηση των διευθύνσεων IP από το IPv4. Συγκεριμένα, ορίζει τη δυνατότητα χρήσης τμήματος της host address για τη δημιουργία υποδικτύων.

Στην εργασία αυτή θα πρέπει να κατασκευάσετε ένα πρόγραμμα το οποίο θα δέχεται ως είσοδο μια διεύθυνση IP και το subnet mask σε dotted decimal μορφή και θα δίνει ως έξοδο:

o Τη διεύθυνση δικτύου (network address) σε δυαδική, dotted decimal και δεκαεξαδική. μορφή

o Τη διεύθυνση κόμβου (host address) σε δυαδική, dotted decimal και δεκαεξαδική μορφή.

 

 

Το Α σκέλος το έχω κάνει.Μπορεί κάποιος να μου πει καμια ιδέα για το πώς να κάνω το Β?

Δημοσ.

Αν δε κανω λαθος.

>int main(int argc, char *argv[])
{

unsigned int ip,mask,sub,host;
unsigned char buf[4];

printf("Dwse ip:");
scanf("%d.%d.%d.%d",&buf[0],&buf[1],&buf[2],&buf[3]);
ip = *((int*)buf);
printf("\nDwse mask:");
scanf("%d.%d.%d.%d",&buf[0],&buf[1],&buf[2],&buf[3]);
mask = *((int*)buf);
sub = ip & mask;
memcpy(buf,&sub,4);
printf("\nSubnet HEX:%x Ip:%d.%d.%d.%d\n",sub,buf[0],buf[1],buf[2],buf[3]);
host = ip & (~mask);
memcpy(buf,&host,4);
printf("\nHost HEX:%x Ip:%d.%d.%d.%d\n",host,buf[0],buf[1],buf[2],buf[3]);
   return 0;
}

 

Δημοσ.

Σε ευχαριστώ πολύ για την απάντηση.Βασικά παρατήρησα ότι τα HEΧ τα εμφανίζει αντίστροφα.Δηλαδή εμφανίζει από το τέλος προς την αρχή.Υπάρχει τρόπος διόρθωσης?Για μετατροπή σε binary το μόνο που θα κάνω είναι να πάρω το host και το subnet θα τα μετατρέπω σε binary και θα τα επιστρέφω?Γιατί το δοκίμασα και εμφανίζει έναν ό,τι να'ναι αριθμό.Κατά τα άλλα το πρόγραμμα λειτουργεί άψογα.!

Δημοσ.

Βασικά δεν με πολυπειράζει η αντίστροφη εμφάνιση.Θα το γράψω στο documentation του προγράμματος οπότε με καλύπτει.Τώρα όσον αφορά την μετατροπή σε binary ακόμα δεν έχω βγάλει άκρη.Σύμφωνα με τον κώδικα που μου έστειλες μετατρέπεις σε ακέραιο την ip και την mask σωστά?και μετά χρησιμοποιειείς bitwise AND μεταξύ ip και mask και bitwise AND μεταξύ ip και reverse mask(~mask) για τον υπολογισμό του sub και του host αντίστοιχα.Ωραία μέχρι εδώ.Θεωρητικά δεν παίρνω το ip και το mask και τα μετατρέπω σε binary ξεχωριστά?

Ο κώδικας που χρησιμοποιώ είναι ο εξής:

>
void convertDecToBin(int dec[],char bin[4][9]) {

 int i, j;

 for (i=0; i<4; i++) {
   for (j=7; j>=0; j--) {
     bin[i][j] = (dec[i] & 1) + '0';
     dec[i] /= 2;
   }
   bin[i][8] = 0;
 }

}

Και επιστρέφει έναν πίνακα χαρακτήρων που περιέχουν την binary μορφή του ακεραίου.Το πρόβλημά μου είναι όταν την καλώ στην main.Τι ορίσματα θα δώσω στην συνάρτηση?

Δημοσ.

Μετατρεπω την ip σε int για να κανω τις πραξεις μου με το NOT και AND

κατι τατοιο

ip192.168.0.2 AND mask255.255.0.0 = 192.168.0.0 subnet

NOT mask255.255.0.0 = 0.0.255.255 subnatmask

ip192.168.0.2 AND mask0.0.255.255 = 0.0.0.2 host

 

Για αναπαρασταση του σε binary κανε κατι τετοιο

>void dectobin(unsigned int v, char b[33])
{
b[32] = '\0';
for(int i = 31 ; i >= 0; i--,v>>=1)
	b[i] = (v & 1) ? '0' : '1';
}

 

πχ

char buf[33];

dectobin(100,buf);

printf(buf);

 

ΥΓ αν σε μπερδευει η αναφορα της ip ως int, τοτε καντο με το δυσκολο τροπο... struct Ip και functions που να κανουν τις λογικες πραξεις πχ

>typedef struct 
{
unsigned char p1,p2,p3,p4;
}Ip;
Ip Host(Ip ip,Ip mask)
{
Ip result;
result.p1 = ip.p1 & mask.p1;
result.p2 = ip.p2 & mask.p2;
result.p3 = ip.p3 & mask.p3;
result.p4 = ip.p4 & mask.p4;
return result;
}

 

Δημοσ.

Κάνω το εξής:

>
void dec2bin(int decimal, char *binary)
{
 int  k = 0, n = 0;
 int  neg_flag = 0;
 int  remain;
 int  old_decimal;  // για τεστάρισμα
 char temp[80];

 // Έλεγχος για αρνητική είσοδο
 if (decimal < 0)
 {      
   decimal = -decimal;
   neg_flag = 1;
 }
 do 
 {
   old_decimal = decimal;
   remain    = decimal % 2;
   decimal   = decimal / 2;
   // Μετατρέπει το ψηφίο 0 ή 1 σε χαρακτήρα '0' ή '1'
   temp[k++] = remain + '0';
 } while (decimal > 0);

 if (neg_flag)
   temp[k++] = '-';       // πρόσθεση - 
 else
   temp[k++] = ' ';       // κενό

 // αντιστρέφει το spelling
 while (k >= 0)
   binary[n++] = temp[--k];

 binary[n-1] = 0;         // τέλος με NULL
}

και στην main την καλώ ως εξής:

>
dec2bin(sub,buf2);
printf("%s",buf2);
ή
dec2bin(host,buf2);
printf("%s",buf2);

Σου φαίνεται σωστό?

Δημοσ.

Αν δε κανω λαθος.

>int main(int argc, char *argv[])
{

unsigned int ip,mask,sub,host;
unsigned char buf[4];

printf("Dwse ip:");
scanf("%d.%d.%d.%d",&buf[0],&buf[1],&buf[2],&buf[3]);
ip = *((int*)buf);
printf("\nDwse mask:");
scanf("%d.%d.%d.%d",&buf[0],&buf[1],&buf[2],&buf[3]);
mask = *((int*)buf);
sub = ip & mask;
memcpy(buf,&sub,4);
printf("\nSubnet HEX:%x Ip:%d.%d.%d.%d\n",sub,buf[0],buf[1],buf[2],buf[3]);
host = ip & (~mask);
memcpy(buf,&host,4);
printf("\nHost HEX:%x Ip:%d.%d.%d.%d\n",host,buf[0],buf[1],buf[2],buf[3]);
   return 0;
}

 

 

Ευγένιε,

 

Εδώ έχει υποθέσει ότι sizeof(int) == sizeof(char) ;

Πως δουλεύει αυτό;

scanf("%d.%d.%d.%d",&buf[0],&buf[1],&buf[2],&buf[3]);

 

Κάνω το εξής:

>
void dec2bin(int decimal, char *binary)
{
 int  k = 0, n = 0;
 int  neg_flag = 0;
 int  remain;
 int  old_decimal;  // για τεστάρισμα
 char temp[80];

 // Έλεγχος για αρνητική είσοδο
 if (decimal < 0)
 {      
   decimal = -decimal;
   neg_flag = 1;
 }
 do 
 {
   old_decimal = decimal;
   remain    = decimal % 2;
   decimal   = decimal / 2;
   // Μετατρέπει το ψηφίο 0 ή 1 σε χαρακτήρα '0' ή '1'
   temp[k++] = remain + '0';
 } while (decimal > 0);

 if (neg_flag)
   temp[k++] = '-';       // πρόσθεση - 
 else
   temp[k++] = ' ';       // κενό

 // αντιστρέφει το spelling
 while (k >= 0)
   binary[n++] = temp[--k];

 binary[n-1] = 0;         // τέλος με NULL
}

και στην main την καλώ ως εξής:

>
dec2bin(sub,buf2);
printf("%s",buf2);
ή
dec2bin(host,buf2);
printf("%s",buf2);

Σου φαίνεται σωστό?

 

Αρχικά ίσως θα ήταν προτιμότερο να επιστρέφεις char* και όχι void με το function, μετά προσωπικά θα προτιμούσα κάτι με realloc για κάθε ψηφίο, επίσης δεν χρειάζεσαι temp πίνακα υπάρχει και η strrev, ή φτιάχνεις εύκολα μία strrev, κάτσε να σου ξεθάψω καμία και να σου στείλω.

 

char *mystrRev(char *strBuf)

{

char* p = strBuf, *q = strBuf;

while (*q) q++;

q--;

while (p < q) { *p ^= *q; *q ^= *p; *p ^= *q; p++; q--;}

return strBuf;

}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...