Termen de predare: 28.10.2019, ora 23:55
Pentru fiecare zi (24 de ore) de întârziere, se vor scădea 10 puncte din nota acordată. Temele trimise după 7 de zile de întârziere vor putea fi notate cu maxim 30 de puncte.
În consecință, deadline-ul hard este 04.11.2019, ora 23:55.
Dacă aveți nelămuriri, puteți să ne contactați pe forumul dedicat temei de casă nr. 1.
La orice întrebare vom răspunde în maxim 24 de ore.
Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.
În această temă o să lucrați cu cu adrese IPv4 adresele IP. Programul va citi de la tastatură o serie de date independente (câte o serie pe linie) pe care va trebui să le prelucreze.
Ne propunem să sistematizăm noțiunile de adresă IP, mască de rețea, adresă de rețea și adresă de broadcast.
Adresa IP asigură conectivitatea echipamentelor (calculatoare, telefoane, rutere, servere, etc.) în rețea/Internet.
În cazul unei adrese IP, vom configura, tot timpul, următoarele:
192.168.100.200
1)11111111.00000000.00000000.00000000
este o mască de rețea validă, iar 11000001.00000000.00000000.0000000
este o mască nevalidă. Pentru a ușura citirea măștii acestea se scrie în zecimal, similar adresei IP: 11111111.00000000.00000000.00000000
= 255.0.0.0
. Datorită proprietății speciale în care biții de 1 sunt consecutivi o altă formă în care veți mai găsi specificată masca de rețea este forma prefixată: /X
, unde X reprezintă numărul de biți de 1: 11111111.00000000.00000000.00000000
= 255.0.0.0
= /8
.Pornind de la adresa IP și masca de rețea putem identifica două alte proprietăți ale unei rețele (pentru exemplificare vom folosi adresa IP 192.168.100.200/255.255.255.0):
192.168.100.200 & 255.255.255.0 = 192.168.100.0
192.168.100.200 | 0.0.0.255 = 192.168.100.255
Atunci când cunoaștem adresa IP și masca de rețea și vrem să obținem adresa de rețea și adresa de broadcast, este util să folosim masca de rețea pentru a împărți adresa IP în două:
Pe această împărțire pentru adresa 192.168.100.200/24 vom obține aceleași valori precum cele calculate mai sus, lucru reflectat și în figura de mai jos.
Să obținem adresa de rețea și adresa de broadcast pentru adresa 172.16.200.100/20
.
Transformăm adresa într-o adresă hibridă punând biți de 0 acolo unde se găsește masca de rețea: al treilea octet din cei patru ai adresei IP: 172.16.1100|1000.xxxxxxxx
. Am folosit operatorul | (pipe) pentru a separa partea de rețea (primii 20 de biți, aferenți rețelei) de partea de stație (host) (ceilalți biți (32-20 = 12 biți) aferenți stației). Nu sunt relevanți pentru calculul nostru biții ultimului octet așa că am pus xxxxxxxx
în locul lor.
Adresa de rețea are toți biții de stație puși pe 0, deci va fi 172.16.1100|0000.00000000
. Rezultă adresa de rețea 172.16.192.0/20
.
Adresa de broadcast are toți biții de stație puși pe 1, deci va fi 172.16.1100|1111.11111111
. Rezultă adresa de broadcast 172.16.207.255/20
.
Un set de date (o linie) va fi compus din mai multe elemente. Elementele vor fi întotdeauna separate printr-un spațiu.
Unele elemente sunt utile doar pentru implementarea anumitor task-uri. Dacă nu doriți să implementați acele task-uri, va trebui să găsiți o metodă prin care să le ignorați (ex: să le citiți, dar să nu faceți neapărat ceva util cu ele).
Format:
MSK_1 MSK_2 IP_1 IP_2 N [NET_1 NET_2 ... NET_N]
Pe prima linie se va citi numărul de seturi de date. Veți avea de rezolvat mai multe taskuri. Puteți să implementați doar o parte din ele. Pentru fiecare set de date se va afișa output-ul corespunzător tuturor task-urilor implementate, ulterior se va trece la un alt set de date, dacă este cazul. Fiecare set de date va fi precedat de o linie cu numărul setului de date. Astfel, dacă cineva a rezolvat doar task-ul 0 și task-ul 2, iar testul conține 2 seturi de date:
Afișați adresa IP_1 împreună cu MSK_2 în formatul: IP_1/MSK_2.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-0 192.168.25.87/20
Afișați masca MSK_2 în format zecimal.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-1 255.255.240.0
Afișați valorile: MSK_1 în baza 8 și în baza 16, separate printr-un spațiu. Nu este necesar să faceți conversia explicită. Puteți să vă folosiți de facilitățile oferite de printf.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-2 377.355.0.0 FF.ED.0.0
Afișați adresa de rețea a lui IP_1.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-3 192.168.16.0
Afișați adresa de broadcast a lui IP_1.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-4 192.168.31.255
Determinați dacă IP_2 face parte din aceeași rețea cu IP_1. Dacă răspunsul este afirmativ, atunci se va afișa: DA, altfel NU.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-5 DA
Verificați corectitudinea măstii de rețea MSK_1. Dacă răspunsul este afirmativ, atunci se va afișa: DA, altfel NU.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-6 NU
Dacă răspunsul la task-ul 6 a fost afirmativ, atunci afișați MSK_1. Altfel, corectați masca MSK_1 setând pe 0 toți biții care succed cel mai semnificativ bit setat pe 0 și afișați după corectare acea mască.
Note: Atât pentru acest task cât și pentru cel precedent nu se vor lua în considerare soluțiile care doar afișeaza “DA” sau “NU”, respectiv MSK_1, chiar dacă vor trece anumite teste pe checker.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-7 255.224.0.0
Afișați IP_1 reprezentând în binar fiecare octet.
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-8 11000000.10101000.00011001.01010111
Afișați pe un rand indicii rețelelor din care ar putea face parte IP_2, separate de cate un spațiu. (Indexarea începe de la 0).
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
-9 0 2
Input:
1 255.237.0.0 20 192.168.25.87 192.168.26.1 3 192.168.0.0/16 192.0.26.0/16 192.168.26.0/24
Output:
1 -0 192.168.25.87/20 -1 255.255.240.0 -2 377.355.0.0 FF.ED.0.0 -3 192.168.16.0 -4 192.168.31.255 -5 DA -6 NU -7 255.224.0.0 -8 11000000.10101000.00011001.01010111 -9 0 2
Deoarece citirea se face de la tastatură, iar afișarea se face pe ecran, pentru a putea testa mai ușor puteți folosi redirectări de genul:
./ip < input.txt > output.txt
Tema va fi trimisă folosind vmchecker, cursul Programarea Calculatoarelor (CB & CD).
Găsiți arhiva cu checker-ul si makefile-ul aici. Instrucțiunile de rulare ale checkerului le găsiti in fișierul “checker_README” din arhiva
După cum probabil ați observat, task-urile au un total de 100 de puncte, dar motivul pentru acest lucru este ca fiecare test să valoreze 1 punct (adica 0.01 puncte din nota finală). Dacă soluția voastră trece toate testele veți acumula un total de 0.9 puncte (din nota finală). Celelalte 0.1 puncte se vor acorda pentru coding style si README.
Formatul arhivei va fi următorul:
ip.c
.
Lista nu este exhaustivă.
28-1