Client Chat, Cautare hosturi, Transfer de fisiere
5.1 Introducere
Aplicatia care va fi prezentata în continuare reprezinta un client chat, dar în acelasi timp poate cauta calculatoarele active dintr-o retea si poate face transfer de fisiere.
Scopul acestei aplicatii este acela de a demonstra conexiunea între 2 dispozitive (în cazul nostru calculatoare) aflate într-o retea fara fir (wireless).
Mijloacele utilizate în laborator pentru demontratie sunt:
un notebook Acer TravelMate 4050, procesor Intel Pentium M 1,5 Ghz, echipat cu o placa de retea fara fir Intel(R) PRO/Wireless 2200BG, compatibila, asa cum îi spune si numele, atât cu standardul 802.11b, cât si cu 802.11g.
Un PC obisnuit echipat cu o placa de retea wireless PCI 802.11b, produsa de firma MSI.
Se va configura o retea de tip ad-hoc cu ajutorul careia se va realiza comunicatia între cele doua calculatoare; folosim acest tip de retea deoarece nu avem la dispozitie un AP.
Reteaua va primi un nume (SSID): George Butuc; vom avea de ales daca folosim WEP sau nu, daca aceasta cheie este alocata automat sau 222s189c introdusa de noi.
Aplicatia va fi instalata pe ambele calculatoare si se vor testa, pe rând, optiunile de cautare de hosturi, chat, transfer de fisiere.
5.2 Descrierea aplicatiei
Aceasta aplicatie foloseste modelul client-server, cu toate ca reprezinta un singur executabil. Pentru a se realiza conexiunea între cele doua entitati, se folosesc socket-i. Un socket reprezinta un canal generalizat de comunicare între procese. El ofera posibilitatea de comunicare între procese aflate pe hosturi diferite într-o retea.
În momentul în care se doreste crearea unui socket, trebuie specificate atât stilul de comunicatie care va fi folosit, cât si tipul de protocol care îl implementeaza.
Socket-ii folositi sunt de tip TCP (Transport Control Protocol). Acest protocol furnizeaza un flux sigur de date între 2 calculatoare; de asemenea se asigura stabilirea unei conexiuni permanente între cele 2 calculatoare pe parcursul comunicatiei (RFC 793).
Mesajele scrise sunt transmise pe portul 6000, iar transferul de fisiere se face folosind portul 7000.
Respectând modelul client-server, aplicatia poate rula în modul SERVER, atunci când asteapta conexiunea, însa de asemenea se poate comporta ca un CLIENT, fiind cel care va initia conexiunea.
În vederea transmiterii si receptionarii de mesaje, dar si a transferului de fisiere, atât pentru partea de client cât si pentru partea de server, sunt folosite thread-uri separate (sau fire de executie).
Un fir de executie reprezinta o modalitate software de îmbunatatire a performantelor de calcul prin reducerea costului de comutare a proceselor. Fiecare thread reprezinta un flux separat de executie si este caracterizat prin propria sa stiva si stare hardware (registre, flag-uri).
În cazul în care aplicatia intra în modul SERVER se va lansa thread2. acest thread asteapta si accepta conexiuni de pe portul bindat 6000, apoi va lansa o bucla în care sunt primite mesajele de la client. Lansarea acestui thread se efectueaza în momentul când se executa click pe butonul Asteptare conexiune.
Trecând acum în partea cealalta, a CLIENTULUI, în momentul în care se va executa click pe butonul Conectare, aplicatia va lansa threadul numit thread. Acesta se va conecta la adresa IP destinatie folosind portul 6000, port pe care asculta serverul. Dupa ce se realizeaza conexiunea, se intra de asemenea într-o bucla de receptionare a mesajelor.
În cazul unei erori la conectare, ambele threaduri (atât thread cât si thread2) vor afisa mesajul Conexiune încheiata si se vor închide.
Înainte de a se intra în bucla pentru receptionarea mesajelor, se va calcula viteza aproximativa a conexiunii. Acest lucru se realizeaza prin transferul unui buffer de 100 kbytes si masurarea timpului necesar pentru acest transfer; timpul final necesar transferului acestui buffer se calculeaza în momentul primirii unui mesaj de confirmare de la server. În cazul de fata, acest mesaj de confirmare este reprezentat de primirea caracterului "K".
În cazul în care se va realiza conexiunea cu succes, aplicatia va lansa de asemenea threadul numit thread3; acest thread va asculta pe portul 7000 si va astepta un eventual transfer de fisiere.
Din momentul în care se accepta o conexiune în vederea transferului unui fisier, sunt parcurse mai multe etape:
Prima data se va receptiona marimea numelui fisierului care urmeaza sa fie transferat;
Se primeste numele fisierului;
Se activeaza dialogul prin care se va specifica directorul în care va fi salvat fisierul;
Se primeste marimea fisierului;
Se face transferul propriu-zis al fisierului în pachete de câte 1 KB.
Transferul de fisiere va porni numai dupa ce se va afisa dialogul care indica progresul transferului fisierului; acest dialog este activat într-un thread separat numit thread4. Aceasta implementare, de a actualiza informatiile din dialogul de transfer într-un thread separat fata de cel care activeaza dialogul, a fost aleasa pentru a nu se bloca interfata grafica, cât timp dureaza transferul fisierului.
În momentul în care se doreste transferul unui fisier, se executa click pe butonul Trimite fisier. În acest moment se creeaza un socket care se va conecta la adresa IP destinatie pe portul 7000; se activeaza dialogul în care se va specifica fisierul care urmeaza a fi transferat; dupa ce se va selecta fisierul, sunt urmate urmatoarele etape:
Se deschide dialogul prin care se va selecta fisierul care va fi trimis;
Se va trimite marimea numeleui fisierului care urmeaza a fi transferat;
Se trimite numele fisierului;
Se trimite marimea fisierului;
Se face transferul propriu-zis al fisierului în pachete de câte 1 KB.
Adresa IP la care se va conecta clientul poate fi introdusa manual în caseta de text rezervata pentru acest lucru; daca totusi nu se doreste introducerea manuala a adresei IP, se poate scana reteaua dupa hosturile active prin apasarea butonului Scanare. Aceasta functie se bazeaza pe clasa CPING, ce permite trimiterea de pachete ICMP catre un calculator si receptia pachetului de raspuns, în cazul în care acel calculator este activ. Astfel se poate realiza o lista cu toate calculatoarele active dintr-o retea, lista sub forma unui combo-box. Din aceasta lista se poate selecta adresa IP cu care se va realiya conexiunea.
Trimiterea pachetelor ICMP este realizata prin crearea unui socket de tip SOCKET_RAW; acest tip de socket permite folosirea protocoalelor de comunicatie la nivelul IP (ICMP, UDP,TCP etc).
Interfata grafica a fost realizata folosind, in cazul butoanelor, o clasa personalizata ce permite afisarea acestora într-un mod ce poate fi configurat; se pot astfel afisa butoanele plate, se poate asocia fiecarui buton un icon sau un bitmap, se pot specifica culorile de background atât timp cât pointerul mausului este în interior sau în afara butoanelor; se poate alege o culoare transparenta a butoanelor, etc; aceasta clasa are suport si pentru controale de tip checkbox (vezi butonul asteapta conexiune).
În clasa FileTransferDlg se trateaza mesajul WM_INITDIALOG in functia OnInitDialog(). În aceasta functie variabila begindownload ia valoarea 1 pentru a semnala threadului thread3 ca dialogul ce indica progresul transferului de fisier a fost afisat si se pot actualiza informatiile de pe el cu privire la transferul de fisiere.
Clasa FilePickCtrl contine implementarea controlului ce este folosit la selectarea fisierului ce urmeaza a fi transferat, cat si a directorului destinatie in care va fi salvat. In cazul in care se doreste doar selectia unui director, se apeleaza functia pusa la dispozitie de acest control SetDirOnly(), cu parametrul valoarea booleana TRUE.
5.3 Modul de functionare
5.3.1Cautarea hosturilor active din retea
Pentru a putea comunica cu un alt calculator, aplicatia are nevoie de o adresa IP la care sa se conecteze; prin apasarea butonului Scanare, vor fi cautate în retea hosturile active, iar cu aceste hosturi se populeaza o lista (aceasta lista se populeaza cu adresele IP). Figura 5.1 ne arata cum putem cauta hosturile si unde se afla ele.
Dupa ce operatia de scanare este terminata, putem alege adresa IP cu are dorim sa comunicam; acest lucru se poate face în 2 moduri:
introducem manual adresa IP în câmpul destinat;
selectam adresa din câmpul de adrese obtinut în urma în urma activarii functiei de cautare.
Oricare din aceste doua variante se poate folosi fara probleme.
5.3.2 Conectarea
Dupa ce caseta pentru adresa IP a hostului la care ne dorim conectarea a fost populata cu un IP, putem apasa butonul Conectare. Dupa ce conexiunea este realizata cu celalalt host, se va afisa mesajul de Conexiune realizata, precum si viteza conexiunii, asa cum se vede si în figura 5.2.
De retinut ca hostul la care ne vom conecta trebuie sa aiba aplicatia pornita în modul Asteptare conexiune, pentru a putea accepta o conexiune.
Viteza conexiunii este relativa, fiind calculata cu ajutorul unui buffer de 100 KB, trimis de sursa catre destinatie, si calculându-se timpul în care a fost receptionat.
Dupa ce este realizata conexiunea, butonul Conectare se transforma în butonul Deconectare, dupa cum se observa si în figura 5.2. Deconectarea nu se poate realiza decât de cel care a initiat conexiunea; daca se doreste deconetarea de catre destinatie, singura posibilitate este de a închide aplicatia.
5.3.3 Transmitere/receptionare de mesaje
Mesajele se vor scrie în spatiul rezervat; dupa ce textul este scris, pentru a-l putea transmite, se apasa fie butonul Trimite, fie tasta Enter; se poate folosi fara probleme oricare dintre variante.
Mesajele primite sunt vizualizate din acelasi loc ca si cele trimise, se pastreaza un istoric al mesajelor, pâna la închiderea aplicatiei.
5.3.4 Transmitere/receptionare de fisiere
Dupa cum spuneam si la începul acestei prezentari, aceasta aplicatie poate face si transfer de fisiere. Transferul de fisiere se poate realiza prin apasarea butonului Trimite fisier. Se va deschide o fereastra în care va trebui sa selectam fisierul pe care dorim sa îl trimitem.
Directorul Up one directory urca un nivel în arborele cu directoare, mergând în directorul parinte al directorului curent. Dupa ce se va selecta fisierul dorit, se actioneaza butonul Ok.
La receptie, dupa ce sursa va apasa butonul Ok, destinatia va putea alege, cu ajutorul unei casete de dialog asemanatoare cu cea folosita pentru selectarea fitierului ce se doreste a fi trimis, locul unde fisierul va fi salvat.
Dupa ce se selecteaza locul în care va fi salvat fisierul, începe transferul propriu-zis, afisându-se si viteza de transfer instantanee (vezi figura 5.5). Dupa ce transferul este realizat, se actioneaza butonul Ok al ferestrei de transfer.
|