Реферат

Реферат Sistem Client-Server pentru administrarea la distan a calculatoarelor

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 26.11.2024





Universitatea Politehnica Bucureşti

Facultatea de Automatică şi Calculatoare

Sistem Client-Server pentru administrarea la distanţă a calculatoarelor
Coordonator Ştiinţific

Prof. Dr. Ing. Florian Moraru

Absolvent

Ciucă Mihai Andrei
Cuprins
1.      Introducere şi concepte de bază..............................................................................3

2.      Modul de funcţionare al aplicaţiei.........................................................................10

2.1 Opţiunile disponibile din meniul de conexiune................................................10

2.2 Opţiunile disponibile din meniul de interacţiune cu sistemul de fişiere..........12

2.3 Opţiunile disponibile din meniul de căutare a fişierelor..................................19

2.4 Opţiunile disponibile din meniul de obţinere a ecranului calculatorului aflat la distanţă..................................................................................................................21

2.5 Opţiunile disponibile din meniul de obţinere/manipulare a proceselor calculatorului aflat la distanţă...............................................................................23

2.6 Opţiunile disponibile din meniul de obţinere/manipulare a ferestrelor deschise pe calculatorul aflat la distanţă...............................................................27

2.7 Opţiunile disponibile din meniul de distracţie (fără o folosinţă practică deosebită)..............................................................................................................34

3.      Detalii despre implementare.................................................................................43

4.      Concluzii si dezvoltări ulterioare............................................................................64

5.      Bibliografie.............................................................................................................65



1. Introducere si concepte de baza


Limbajul de programare Pascal :


Pascal este unul dintre limbajele de programare de referinţă în ştiinţa calculatoarelor, fiind cel care a definit programarea calculatoarelor. Pascal a fost dezvoltat de elveţianul Niklaus Wirth în 1970 pentru a pune în practică programarea structurată, aceasta fiind mai uşor de compilat. Unul din marile sale avantaje este asemănarea cu limbajul natural limba engleză, ceea ce îl face limbajul ideal pentru cei care sunt la primul contact cu programarea. Pascal este bazat pe limbajul Algol şi a fost denumit astfel în onoarea matematicianului Blaise Pascal, creditat pentru construirea primelor maşini de calcul numeric. Wirth a mai dezvoltat limbajele Modula-2 şi Oberon, similare cu Pascal.

Cele mai populare implementări a acestui limbaj au fost Turbo Pascal şi Borland Pascal, ambele ale firmei Borland cu versiuni pentru Macintosh şi DOS, care i-au adăugat limbajului obiecte şi au fost continuate cu versiuni destinate programării vizuale pentru Microsoft Windows (limbajul Delphi) şi pentru Linux (Kylix).

În prezent există şi alte implementări mai mult sau mai puţin populare, dar gratuite, printre care se remarcă Free Pascal şi GNU Pascal.

Ce este Delphi?

Delphi este un limbaj de programare, produs iniţial de firma americană Borland, iar apoi de CodeGear, o firmă deţinută de Borland. Pe data de 7 mai 2008 a fost anunţată vânzarea CodeGear către Embarcadero Technologies pentru suma de 23 de milioane de dolari.

Limbajul Delphi este varianta celor de la Borland de Object Pascal1 (Pascal cu obiecte), care este evoluţia limbajului Pascal, creat în 1970 de Niklaus Wirth ca limbaj de programare cu scop didactic. Iniţial a fost produs pentru sistemele de operare Microsoft Windows, apoi a urmat o perioadă în care se producea şi o versiune pentru GNU/Linux (denumită Kylix). Până în anul 2008, versiunile existente au fost cea pentru aplicaţii native Microsoft Windows şi cea pentru Microsoft .NET Framework.

Lansat în al treilea trimestru al anului 2008, Delphi Prism a înlocuit Delphi.NET, versiunea de Delphi pentru platforma Microsoft.NET.

Echipa care dezvoltă Delphi a fost condusă iniţial de Anders Hejlsberg, tot el conducând şi echipa care se ocupa de dezvoltarea Turbo Pascal-ului. În 1996 Anders Hejlsberg a fost angajat de Microsoft, unde, printre altele, a condus echipa care a dezvoltat limbajul C#, având totodată un rol important în dezvoltarea platformei Microsoft .NET.

La ce este bun?

Scopul principal pentru care Delphi a apărut a fost crearea rapidă a aplicaţiilor pentru Microsoft Windows. Un important atu de care Delphi a beneficiat de la început a fost IDE2-ul (Integrated Development Environment) cu care era distribuit. Acesta, fiind de tip RAD (Rapid Application Development), permitea crearea unei aplicaţii grafice minimale pentru Microsoft Windows cu doar câteva clicuri de maus, depaşind la acest capitol toate aplicaţiile de pe piaţă la ora aceea. Principalul său competitor surclasat era Microsoft Visual Basic, motiv pentru care a fost poreclit Visual Basic Killer. Cu timpul, numele “Delphi” a început să fie folosit şi pentru IDE, nu doar pentru limbaj.

Tipul de aplicaţie pentru care Delphi este folosit cel mai des este VCL Forms Application, bazată pe Visual Component Library, un set de librării create de Borland pentru dezvoltarea de aplicaţii Microsoft Windows.

Cum arată codul? :


Delphi permite crearea mai multor tipuri de proiecte:

-          Aplicaţie VCL Forms

-          Aplicaţie pentru consolă

-          DLL3 4 Dynamic-Link Library


-          Delphi Package (componente pentru IDE-ul Delphi-ului şi pentru aplicaţiile scrise în Delphi)


-          Aplicaţie serviciu


-          Aplicaţie pentru Control Panel

Structura unui proiect VCL Forms :


Un proiect VCL Forms tipic este format din 3 fişiere. Presupunând că se folosesc numele predefinite de IDE, aceste fişiere sunt:

-          Project1.dpr – conţine iniţializarea aplicaţiei, crearea form-ului principal şi apelul de rulare a aplicaţiei

-          Unit1.pas – conţine form-ul principal

-          Unit1.dfm – conţine valori pentru iniţializarea form-ului principal (poziţie, dimensiuni, etc)

La crearea unui proiect nou, Delphi creează cele 3 fişiere şi scrie în ele codul necesar pentru o aplicaţie minimală, dar gata de rulare imediat după compilare, fără a fi nevoie să se scrie manual cod.
VCL :

VCL (Visual Component Library) sau Biblioteca de Componente Vizuale este scheletul folosit pentru construirea de aplicaţii Microsoft Windows, oferit de Borland pentru utilizarea în mediile integrate de programare (IDE) Delphi şi C++ Builder. Este scris în Object Pascal.

Echivalentul acestei biblioteci pentru alte platforme se numeşte CLX (Component Library for Cross Platform) şi a fost construit pentru folosirea acesteia în Delphi, C++ Builder şi Kylix.

Cu o abordare orientată spre obiecte, toate obiectele incluse în VCL moştenesc direct sau indirect clasa TObject. Aceasta este necesară pentru că Delphi nu suportă moştenire multiplă, spre deosebire de C++. Abordarea folosită în VCL este uşor de utilizat pentru ca a fost folosită de Smalltalk, primul limbaj de programare cu adevărat orientat spre obiecte. Aceasta apropie Delphi de Java, care la fel foloseşte o clasă de bază numită Object.

Principiul DLL :

Principiul DLL reprezintă o facilitate de gestionare a memoriei prin care se pot introduce toate funcţiile de bază, care sunt necesare tuturor programelor în module care conţin seturi de funcţii utilizate în comun de către aplicaţii.

Principiul DLL constă în faptul că un program care se află în execuţie "ştie" dinainte ce funcţie trebuie să folosească pentru a executa o anumită prelucrare şi comunică astfel incă de la lansare ce DLL trebuie să utilizeze. Dacă Windows găseşte DLL-ul căutat, îl încarcă şi-l execută, după care, la terminare redă controlul programului apelant.

Avantajul incontestabil pe care îl dau fişierele DLL este economiserea memoriei necesare aplicaţiilor care prin punerea în comun a funcţiilor de bază, ocupă mai puţină memorie. Un fişier DLL se introduce o singură dată în memorie indiferent cîte programe îi accesează funcţiile. Toate facilităţile noi proprii aplicaţiilor (OLE, multimedia) sunt introduse prin fişiere tip bibliotecă de funcţii: DLL

No
t
iunea de obiect. Caracteristici.

Ideea OOP este de a pune la un loc, într-un singur container, atât datele cât şi partea de

cod(proceduri şi funcţii, care poartă denumirea de metode) . Containerul se numeşte obiect.
Obiectul relevă utilizatorului (programatorului care utilizează obiectul) doar ceea ce

este necesar, astfel încât utilizarea obiectului să fie cât mai uşoară. Toate mecanismele interne

pe care utilizatorul nu are nevoie să le cunoască sunt ascunse. OOP permite o abordare

modulară a programării, ceea ce ne fereşte de necesitatea rescrierii unor părţi de cod.
O altă caracteristică importantă a obiectelor este moş
tenirea
. Prin moş
tenire
se înţelege

acea proprietate a obiectelor prin care un obiect nou construit preia datele şi metodele unui alt

obiect, părinte. Această caracteristică ne permite scrierea rapidă şi uşoară a unor obiecte

asemănătoare, care au unele date şi metode comune.
Se poate întâmpla ca anumite metode a unei clase să fie rescrise, astfel încât, chiar

dacă o clasă descendentă are metode cu acelaşi nume, să facă cu totul altceva. Această

caracteristică poartă denumirea de polimorfism.

No
ţ
iunea de clas
ă
. Caracteristici.


O clasă sau un tip de clasă definesc o structură ce conţine câ
mpuri, metode
şi

propriet
ăţ
i.
Instanţa unui tip de clasă poartă denumirea de obiect1.
Un câ
mp
este de fapt o variabilă care face parte dintr-un obiect. La fel ca şi câmpurile

unui record, câmpul unei clase reprezintă o dată care există în fiecare instanţă a unei clase.
O metodă este o procedură sau o funcţie asociată cu o clasă. Majoritatea metodelor

operează asupra obiectelor, care sunt instanţe ale claselor.
O proprietate este o interfaţă pentru data asociată unui obiect(dată care de obicei este

stocată într-un câmp). Proprietăţ
ile
au specificatori de acces care determină modul în care

datele pot fi citite sau modificate. Din program, din afara obiectului, o proprietate apare cel

mai adesea la fel ca un câmp.
Pentru obiecte se alocă dinamic blocuri de memorie a căror structură este determinată

de tipul de clasă. Fiecare obiect are o copie unică a fiecărui câmp definit în clasă, dar toate

instanţele unei clase împart aceleaşi metode. Obiectele sunt create şi distruse cu ajutorul unor

metode speciale numite constructori şi destructori.


Constructorul este o metodă utilizată pentru crearea unei instanţe a unei clase. Are

rolul de a iniţializa unele câmpuri, de a aloca memorie, sau a face tot ceea ce este necesar

iniţializării obiectului. Nu este obligatoriu să definim un constructor, dacă acesta nu a fost

definit se utilizează constructorul implicit Create.


Destructorul este o metodă specială care este apelată automat la distrugerea obiectului.

De obicei destructorul este văzut ca fiind inversul constructorului, el ocupându-se de

dezalocarea memoriei alocate clasei. Nu este obligatoriu ca fiecare clasă să aibă un destructor.

Vizibilitatea membrilor unei clase.
Fiecare membru a unei clase are un atribut denumit vizibilitate, care este indicată de

unul dintre cuvintele rezervate: private, protected, public, published.
Vizibilitatea determină modul în care membrii pot fi accesaţi:

-           Private un membru private este invizibil în afara clasei în care este declarat, altfel

spus o metodă declarată ca fiind private nu poate fi apelată din alt modul, iar un câmp

sau proprietate nu pot fi citite sau scrise din alt modul

-           Protected un membru protected este vizibil doar în clasa în care a fost declarat şi în

toate clasele descendente.

-           Public un membru public este vizibil în exteriorul clasei.

-          Published acest mod de acces este utilizat atunci când se scriu componente. Toţi

membrii declaraţi în această zonă vor fi vizibili în Object Inspector.

În scrierea programelor Delphi este utilizată foarte mult OOP deoarece se utilizează în

special componente. Aceste componente sunt obiecte (dar nu toate obiectele sunt

componente!) care fie sunt create de utilizator, fie sunt venite împreună cu Delphi-ul, şi pot fi

reutilizate în orice alt program.

Aplicaţii dezvoltate în Delphi :

-          Skype

-          Partition Magic

-          Total Commander

-          Feed Reader

-          Ultra ISO

-          Dev-C++

-          RadLight

Care este scopul programului dezvoltat ?

            Sistemul client-server isi propune sa poate stabili o conexiune intre 2 calculatoare, urmand sa controleze, pe baza unui protocol peste HTTP, diverse aspecte ale functionarii calculatorului pe care este instalat serverul.

            Cu ajutorul lui un utilizator poate accesa sistemul de fisiere al calculatorului aflat la distanta, putand executa aproape toate operatiile disponibile si pe calculatorul la care tasteaza. Astfel sunt posibile urmatoarele operatii :

-          Explorarea directoarelor sistemului pe care ruleaza serverul, putand fi accesate toate partitiile disponibile

-          Copierea unui fisier de pe sistemul aflat la distanta pe sistemul pe care ruleaza clientul (cu posibilitatea de oprire inainte de terminare)

-          Uploadarea unui fisier local pe sistemul aflat la distanta (cu posibilitatea de oprire inainte de terminare)

-          Stergerea unui fisier

-          Stergerea unui director

-          Crearea unui fisier

-          Crearea unui director

-          Obtinerea de informatii despre un fisier

-          Rularea unui executabil pe sistemul gazda al serverului (executabilul trebuie sa fie localizat pe masina serverului)

-          Cautarea unui fisier :

o       Pe toate partitiile

o       Doar intr-o subcale specificata
Alt set de operatii se pot efectua asupra proceselor care ruleaza pe sistem :

-          Se poate obtine o lista cu toate procesele care ruleaza pe sistemul gazda al serverului

-          Lista este afisata intr-un mod arborescent, putand fi observata ierarhia proceselor

-          Se poate actiona asupra unui proces in sensul trimiterii unei cereri de inchidere
Operatii asupra ferestrelor deschise pe sistemul serverului :

-          Se poate obtine o lista cu toate ferestrele deschise pe sistemul gazda al serverului (titlu fereastra, identificator fereastra, identificator fereastra parinte)

-          Asupra acesto ferestre se pot executa diverse operatii :

o       Se poate schimba titlul ferestrei

o       Se poate incerca inchiderea programului asociat cu fereastra prin trimiterea unui mesaj normal de inchidere

o       Se poate activa fereastra

o       Se poate dezactiva fereastra

o       Se poate schimba forma ferestrei

o       Se poate minimiza/maximiza

o       Se poate inchide programul asociat cu fereastra prin inchiderea procesului asociat acestuia

O facilitate interesanta este posibilitatea de obtinere a unei poze desktopului sistemul serverului. Aceasta este salvata in format jpg, fiind nevoie de o librarie auxiliara, care vine cu programul.

Nu in ultimul rand, sunt implementate functionalitati de manipulare a mouse-ului :

-          Poate fi ascuns sau readus la starea normala de afisare

-          Se poate inversa functionalitatea butoanelor mouse-ului, alaturi de posibilitatea de a o aduce la normal

-          Se pot genera click-uri (dreapta sau stanga)  la diferite pozitii arbitrare

-          Se pot genera miscari random ale mouse-ului

-          Cea mai importanta facilitate legata de controlul mouse-ului ar fi posibilitatea de a controla miscarile mouse-ului in real-time. Adica mouseul se va misca pe calculatorul gazda al serverului exact cum se misca mouse-ul pe calculatorul gazda al clientului. Asta alaturi de posibilitatea de a executa si click-uri in cadrul operatiei de control.

Cateva facilitati care nu au neaparat legatura cu o parte practica :

-          Posibilitatea de a trimite un mesaj care sa fie afisat intr-un messagebox aflat in prim-plan


-          Posibilitatea de a deschide/inchide usita unitatii optice


-          Posibilitatea de a inchide calculatorul gazda al serverului


2. Modul de functionare al aplicatiei

2.1 Optiunile disponibile din meniul de conexiune

La pornire acesta este in starea “ deconectat” si pozitionat la tabul corespunzator setarilor pentru conexiune.


            Se pot introduce adresa ip la care se afla clientul si portul pe care asculta. Dupa introducerea datelor necesare, se initiaza conectarea. In caz de succes, in casuta de text aflata in partea de jos a ferestrei va fi afisat un mesaj care arata statutul de conectat.

               


O conexiune poate fi terminata in orice moment prin apelarea functie de deconectare. Aceasta va face doar sa inchida conexiunea curenta, lasand serverul pornit si disponibil pentru noi conexiuni.


De asemenea, exista si posibilitatea de a trimite serverului comanda de inchidere. Aceasta duce la oprirea serverului de pe masina destinatie si deconectarea clientului.

               

Dupa ce conexiunea este realizata, un client poate trimite in orice moment un “PING” serverului pentru a verifica starea conexiunii. Daca totul este in regula, acesta va raspunde cu un “PONG” iar serverul va afisa in casuta de text aflata in partea de jos a ferestrei un mesaj care arata starea activa a serverului.




                Tot din meniul conexiunii se poate apela functia de recuperare a parolelor. Aceasta functioneaza totusi doar in cazul in care serverul este instalat pe windows 98 sau mai vechi, functia de sistem corespunzatoare fiind eliminata in versiunile ulterioare. Userul si parolele sunt obtinute de catre server si sunt trimise catre client, fiind afisate in casuta de text aflata in partea de jos a ferestrei.

               


2.2 Optiunile disponibile din meniul de interactiune cu sistemul de fisiere

                Inainte de a putea face orice operatie asupra sistemului de fisiere al calculatorului pe care este instalat serverul, trebuie obtinuta lista de discuri logice care pot fi accesate. Acest lucru se realizeaza prin apelarea comenzii “Refresh drives” , ce va trimite un pachet cu dicurile logice disponibile pe sistemul pe care se afla serverul la care este conectat. Se va sari peste unitatile optice (chiar daca contin un cd/dvd inserat), datorita erorilor ce pot aparea in momentul accesarii unui astfel de dispozitiv. Dupa primirea pachetului, acestea vor fi afisate in “drop-down list”-ul alaturat butonului care genereaza comanda.




                Pentru a afisa continutul unui dintre discurile logice, se selecteaza litera acestuia si se apasa “Enter”. In acel moment  este trimisa catre server o cerere de listare a radacinii acelui disc logic. Serverul obtine informatia necesara si trimite catre client mai multe pachete de date. La primire, datele vor fi afisate in “ListView”-ul din partea dreapta, sub forma de iconite.

            Pentru a naviga in structura de directoare se folosesc actiuni similare cu cele folosite in mod normal in Windows Explorer. Astfel, pentru a  accesa un director se efectueaza dublu-click pe el – moment in care se trimite catre server o cerere de listare a directorului respectiv, serverul trimitand inapoi pachete de date cu continutul acelui director. Pentru a ne intoarce un pas inapoi in structura de directoare, se actioneaza iconita din coltul stanga sus al listei. Acest lucru va genera o cerere de listare a directorului precedent celui curent. Iconita nu este disponibila in cazul in care ne aflam in radacina unui disc logic.

            Dupa apelarea unei comenzi care rezulta in modificarea structurii directorului curent, sau daca se vrea sa se verifice daca s-a schimbat ceva in structura directorului, se poate apela functia de “Refresh”. Aceasta va trimite o cerere de listare a directorului curent (in mod similar cu cererea pentru listarea unui nou director sau a directorului precedent) si va afisa noul continut.

               


                Sunt implementate si metode pentru alterarea sistemului de  fisiere de pe sistemul aflat la distanta. Se pot crea directoare si fisiere         . Numele directorului sau al fisierului care se doreste a fi creat este scris in casuta pentru text aflata deasupra tuturor butoanelor, urmand sa se apeleze comanda de creare corespunzatoare. In apelarii comenzii este afisat in mesaj de confirmare sau infirmare a realizarii comenzii. Motivul principal pentru care aceasta ar putea esua este lipsa drepturilor de scriere pentru utilizatorul de pe care este rulat serverul in directorul respectiv.

            Pentru a redenumi un fisier, noul nume este scris in casuta de text aflata deasupra tuturor butoanelor si este selectat fisierul care se vrea redenumit.Va fi redenumit fisierul selectat in ListView-ul din partea dreapta. Comanda este trimisa catre server, care incearca executarea operatiei, intorcand rezultatul operatiei.

            Stergerea se efectueaza in mod similar. Se selecteaza un fisier sau un director din partea dreapta si se apeleaza functia de stergere. Daca se doreste stergerea unui director, acesta trebuie sa fie gol ; in caz contrar, operatia va esua.




                O alta operatie folositoare este obtinerea marimii unui fisier. Se selecteaza din partea dreapta fisierul dorit si se apeleaza comanda. Serverul obtine informatiile despre fisierul in cauza si le trimite clientului. Acesta le afisaza in casuta de text aflata in partea de jos a ferestrei. Marimea este afisata in KB si in B.

            Una dintre cele mai imporante facilitati este downloadarea de fisiere. Se poate selecta un fisier din partea dreapta, si se poate apela functia de copiere. Fisierul va fi downloadat pe sistemul local in directorul “downloads”. Serverul imparte fisierul pentru downloadat in blocuri de 1024 de octeti, pe care ii trimite catre client. Pentru fiecare pachet de date primti de catre client este afisat un mesaj in casuta de text aflata in partea de jos a ferestrei. De asemenea, este prezenta si o bara de progres ; aceasta se umple progresiv in timpul downloadarii fisierului dorit, iar in momentul in care aceasta s-a umplut fisierul este complet downloadat. Download-ul poate fi oprit in orice moment din meniul cu starea conexiunii. Odata oprit, acesta nu poate fi repornit din acelasi punct, fiind nevoie de repornirea de la 0.



               
Alta facilitate importanta este uploadul de fisiere. Sa presupunem ca la un moment-dat ne aflam intr-un director in care dorim sa uploadam un fisier arbitrar. Se lanseaza functia de upload si apare o noua fereastra in care se poate selecta fisierul pentru uploadat. Se trimite la server cererea de upload impreuna cu numele fisierului, iar serverul incearca sa creeze fisierul gol pe sistemul gazda. Daca nu reuseste sa-l creeze, intoarce catre client un mesaj de eroare (in mod normal este datorata faptului ca nu sunt drepturi suficiente pentru scriere) si uploadul nu mai are loc. In conditii normale, in cazul in care fisierul este creat, clientul trimite catre server pachete succesive de 1024 de octeti, pana cand tot fisierul este transmis. Bara de proges indica starea curenta a upload-ului si se umple pe masura ce pachetele de date sunt trimise catre server.

 De asemenea, pentru fiecare pachet trimis este afisat un mesaj in casuta de text aflata in partea de jos a ferestrei. Upload-ul poate fi oprit in orice moment din meniul cu starea conexiunii. Odata oprit, acesta nu poate fi repornit din acelasi punct, fiind nevoie de repornirea de la 0.


               

               
Atunci cand se doreste downloadarea unui fisier este folositor sa se cunoasca marimea fisierului inainte de a incepe procesul de downloadare. Pentru aceasta a fost inclusa o functie de aflare a marimii unui fisier. Se selecteaza fisierul dorit, se lanseaza cererea de aflare a marimii, serverul obtine informatiile necesare si le trimite catre client. Acestea sunt afisate in casuta de text aflata in partea de jos a ferestrei.
2.3 Optiunile disponibile din meniul de cautare a fisierelor

                Programul dispune si de functionalitatea de cautare a fisierelor pe sistemul aflat la distanta. Numele fisierului cautat se introduce in casuta de text din partea stanga-sus si se apeleaza functia de cautare. Aceasta presupune o parcurgerea tuturor directoarelor de pe toate discurile logice de pe masina pe care ruleaza serverul.

Cand serverul primeste cererea porneste aceasta operatie, care poate dura destul de mult , in functie si de marimea discului masinii pe care ruleaza serverul. Pana in momentul in care operatia de cautare este terminata, nu se pot efectua alte operatii, serverul fiind “blocat” in operatia de cautare. Acesta nu va raspunde la PING sau la orice alt fel de operatie. Pe masura ce cautarea avanseaza, serverul salveaza rezultatele cautarii intr-un fisier pe discul local.

Cand termina, trimite clientului o notificare si acesta downloadeaza fisierul cu rezultatele cautarii. Toate aceste operatii se reflecta in mesaje afisate in casuta de text aflata in partea de jos a ferestrei. Dupa downloadarea fisierului cu rezultatele cautarii, acestea pot fi afisate in ListBox-ul din partea dreapta a ferestrei.

Se poate selecta oricare dintre fisierele gasite si pot fi downloadate. Procedeul de download este exact la fel cu cel descris mai sus. Fisierul downloadat este salvat in directorul “downloads”.

            Functia de cautare a unui fisier poate fi lansata si din meniul de interactiune cu sistemul de fisiere. Diferenta este ca fisierul va fi cautat doar in calea curenta (si subdirectoare) in care ne aflam in momentul apelarii functiei. Procesul de cautare decurge la fel ca in cazul apelarii functiei de cautare din meniul de cautare a fisierelor, cu informatii afisate despre progresul operatiei. Pentru a vizualiza rezultatele trebuie totusi sa se apeleze functia de afisare a rezultatelor din meniul de cautare a fisierelor.


2.4 Optiunile disponibile din meniul de obtinere a ecranului calculatorului aflat la distanta

                Din acest meniu se poate lansa functia de obtinere a unui “instantaneu” cu desktopul curent al calculatorului pe care ruleaza serverul. Aici abordasem initial o varianta in care ecranul era obtinut pixel cu pixel si se realiza o compresie huffman a imaginii, care era ulterior trimisa catre client. Totusi, am observat ca folosind compresia jpeg performantele obtinute (legate de timp si spatiu ocupat de imaginea finala) era mai bune. Din acest motiv am ales sa folosesc aceasta compresie.

Astfel este nevoie de o librarie care cunoaste algoritmul jpeg. Libraria (“GRAPH.DLL”) trebuie copiata in directorul in care este instalat windowsul (de exemplu “C:\Windows” , pentru majoritatea calculatoarelor). Ea este incarcata de catre server si este folosita functia de creare a unui jpeg. Din client se poate seta si gradul de compresie : in casuta de text din dreapta butonului care lanseaza trimiterea comenzii de obtinere a pozei ecranului, in care la inceput este scris textul “Compression”, utilizatorul poate introduce un numar de la 0 la 100, care reprezinta compresia dorita. Aceasta va fi trimisa odata cu comanda si va fi data ca parametru functiei de obtinere a jpeg-ului, obtinandu-se astfel un jpeg mai mult sau mai putin comprimat (si ca urmare o calitate mai buna sau mai slaba). Daca este introdusa o valoare invalida, se aplica o compresie default de 20%.

            Dupa ce serverul obtine imaginea, o salveaza ca jpeg local pe masina pe care ruleaza. Urmeaza trimiterea catre client a unui mesaj prin care ii spune ca fisierul a fost construit si salvat, alaturi de numele sau. Dupa ce primeste acest mesaj, clientul afisaza un mesaj de informare pentru utilizator si trimite o cerere de downloadare a imaginii. Imaginea este salvata in directorul “downloads”, director aflat in directorul din care este rulat client, sub numele “ecranu2.jpg”. Pentru vizualizare se acceseaza directorul respectiv si se deschide cu vizualizatorul de imagini instalat pe sistemul local.

            Downloadarea este facuta in mod similar cu downloadarea oricarui fisier. Clientul trimite o cerere de downloadare catre server. Aceasta contine exact locatia fisierului in care este salvata imaginea desktopului, fiind trimisa anterior chiar de catre server. Serverul ii trimite mai intai marimea fisierului rezultat si apoi incepe sa trimita datele imaginii. Datele sunt trimise in pachete de cate 1024 octeti (1 KB) si sunt salvate in fisierul destinatie mentionat anterior (“downloads\ecranu2.jpg”). In acest timp, bara de progres se umple astfel incat la sfarsitul download-ului este plina. Cand download-u este terminat, utilizatorul este anuntat printr-un mesaj corespunzator afisat in casuta de text aflata in partea de jos a ecranului. Dupa aparitia mesajului informational, utilizatorul poate accesa directorul si poate vizualiza imaginea.



2.5 Optiunile disponibile din meniul de obtinere/manipulare a proceselor calculatorului aflat la distanta

                Din acest meniu se pot obtine toate procesele care ruleaza pe calculatorul aflat la distanta. Odata obtinute, acestea pot fi vizualizate sub format unei structuri arborescente. Un proces este lansat in executie de alt proces, acesta devenind parintele sau in acest sens. Datele obtinute de catre server contin si aceasta informatie, care este trimisa catre client. Clientul o foloseste pentru a afisa procesele arborescent.

            Pentru a lansa in executie procesul de obtinere a proceselor de pe calculatorul gazda al serverului, se foloseste butonul “Get processes”. Acesta genereaza trimiterea catre server a unei cereri de obtinere a informatiilor despre procese. Urmeaza sa astepte pana cand serverul ii trimite informatii suplimentare.

            Serverul primeste de la client cererea si porneste operatia de obtinere a informatiilor despre procese. Aceste informatii sunt stocate pe discul local intr-un fisier. Pentru fiecare proces, in acest fisier se scriu informatii despre numele procesului, ID-ul procesului parinte, ID-ul procesului, calea executabilului care a generat acest proces (daca este disponibila).

            Dupa ce serverul terimina de adunat informatiile necesare, trimite catre client un mesaj prin care il anunta ca procesul a luat sfarsit. Mesajul trimis contine deasemenea si informatii pentru ca acesta sa poata fi donwloadat de catre client, si anume calea catre fisier si numele acestuia.

            Clientul primeste mesajul si informatiile despre calea unde stocat fisierul cu rezultatele alaturi de numele fisierului si face o cerere de download catre server. Serverul ii trimite fisierul in mod normal, prin trasferul de bucati de 1024 de octeti, pana la terminarea fisierului. Dupa terminarea download-ului clientul afisaza in casuta de text din partea de jos a ferestrei un mesaj corespunzator, anuntandu-l pe utilizator ca procesele curente au fost obtinute si rezultatele sunt disponibile.

            Odata ce fisierul cu rezultate este pe masina gazda a clientului (fisierul cu rezultate este salvat in directorul “downloads” cu numele “proc.txt”) rezultatele pot fi afisate in TreeView-ul din partea dreapta a ferestrei prin actionarea butonului “View the last list”. Daca totusi rezultatele nu sunt disponibile la apasarea acestui buton, utilizatorul va fi avertizat ca inca nu a fost obtinuta de la server o lista cu procesele. Daca lista cu procesele a fost obtinuta, aceasta este procesata si sunt afisate datele.

            Utilizatorul poate selecta oricare dintre procesele din lista, poate estinde sau comprima arborele si poate efectua operatii asupra proceselor. In momentul selectiei unui nod din arbore in casutele de text din partea stanga-jos sunt afisate informatii despre procesul respectiv : id-ul sau si id-ul parintelui, alaturi de calea catre executabilul care a lansat acest proces in executie (daca aceasta informati exista).

            Orice proces din lista din partea dreapta poate fi selectat si poate fi inchis. Prin apasarea butonului “Kill process” este trimisa catre server o cerere de inchidere a procesului selectat. Dupa trimiterea cererii, clientul asteapta de la server rezultatul executarii comenzii. Inchiderea procesului de pe calculatorul aflat la distanta nu se reflecta imediat in lista de procese din TreeView. Pentru a obtine schimbarile aparute datorita inchiderii procesului selectat trebuie downloadata din nou lista de procese (prin aceasta operatie vechea lista de procese va fi suprascrisa cu noua lista de procese) si trebuie afisata aceasta.

            Atentie : inchiderea anumitor procese poate duce la oprirea functionarii corecte a masinii pe care ruleaza serverul, sau chiar blocarea acesteia. In momentul in care se doreste oprirea unui proces este bine sa se aiba in vedere posibilele consecinte ale acestei actiuni.
Obtinerea si vizualizarea informatiilor despre procese :

               

Oprirea unui proces :



2.6 Optiunile disponibile din meniul de obtinere/manipulare a ferestrelor deschise pe calculatorul aflat la distanta

Din acest meniu se pot obtine toate identificatoarele tuturor ferestrelor deschise pe calculatorul aflat la distanta. Odata obtinute, acestea pot fi vizualizate sub format unei liste de iconite in ListView-ul din partea dreapta a ferestrei. Orice fereastra este asociata cu un proces, aceasta legatura putand fi obtinuta cunoscand identificatorul ferestrei. Aceasta informatie poate fi folosita pentru a termina executia unui proces asociat cu o fereastra (nu merge totusi in toate situatiile). De asemenea, informatiile de identificare a unei ferestre pot fi folosite pentru a opri executia programului asociat cu fereastra respectiva (totusi in majoritatea cazurilor nu este posibil, cel mai indicat fiind sa se incerce oprirea procesului asociat cu acea fereastra).

            Pentru a lansa in executie procesul de obtinere a informatiilor despre ferestrele deschise pe calculatorul gazda al serverului, se foloseste butonul “Get handles”. Acesta genereaza trimiterea catre server a unei cereri de obtinere a informatiilor despre ferestrele deschise. Urmeaza sa astepte pana cand serverul ii trimite informatii suplimentare.

            Serverul primeste de la client cererea si porneste operatia de obtinere a informatiilor despre ferestrele deschise. Aceste informatii sunt stocate pe discul local intr-un fisier. Pentru fiecare fereastra, in acest fisier se scriu informatii despre titlul ferestrei, identificatorul ferestrei si identificatorul ferestrei parinte. O fereastra poate fi deschisa ca fiind de sin statatoare sau poate fi copilul altei ferestre (de exemplu un meniu de selectarea a unui fisier ce poate fi accesat dintr-o fereastra ce gestioneaza upload-ul).

            Dupa ce serverul termina de adunat informatiile necesare, trimite catre client un mesaj prin care il anunta ca procesul a luat sfarsit. Mesajul trimis contine de asemenea si informatii pentru ca acesta sa poata fi donwloadat de catre client, si anume calea catre fisier si numele acestuia.

            Clientul primeste mesajul si informatiile despre calea unde stocat fisierul cu rezultatele alaturi de numele fisierului si face o cerere de download catre server. Serverul ii trimite fisierul in mod normal, prin trasferul de bucati de 1024 de octeti, pana la terminarea fisierului. Dupa terminarea download-ului clientul afisaza in casuta de text din partea de jos a ferestrei un mesaj corespunzator, anuntandu-l pe utilizator ca procesele curente au fost obtinute si rezultatele sunt disponibile.

            Odata ce fisierul cu rezultate este pe masina gazda a clientului (fisierul cu rezultate este salvat in directorul “downloads” cu numele “handles2.txt”) rezultatele pot fi afisate in ListView-ul din partea dreapta a ferestrei prin actionarea butonului “Show results”. Daca totusi rezultatele nu sunt disponibile la apasarea acestui buton, utilizatorul va fi avertizat ca inca nu a fost obtinuta de la server o lista cu informatii despre ferestrele deschise. Daca lista cu informatii despre ferestre a fost obtinuta, aceasta este procesata si sunt afisate datele.

            Utilizatorul poate selecta oricare dintre iconitele din lista (fiecare asociata unei ferestre deschise pe calculatorul gazda al serverului) si poate efectua operatii asupra acelei ferestre.

            Orice fereastra din lista din partea dreapta poate fi selectata si poate fi inchisa. Prin apasarea butonului “Kill process” este trimisa catre server o cerere de inchidere a procesului care a creat fereastra selectata. Dupa trimiterea cererii, clientul asteapta de la server rezultatul executarii comenzii. Inchiderea procesului de pe calculatorul aflat la distanta nu se reflecta imediat in lista de ferestre din ListView. Pentru a obtine schimbarile aparute datorita inchiderii procesului selectat trebuie downloadata din nou lista de ferestre deschise (prin aceasta operatie vechea lista de procese va fi suprascrisa cu noua lista de ferestre) si trebuie afisata aceasta.

            Atentie : inchiderea anumitor procese poate duce la oprirea functionarii corecte a masinii pe care ruleaza serverul, sau chiar blocarea acesteia. In momentul in care se doreste oprirea unui proces este bine sa se aiba in vedere posibilele consecinte ale acestei actiuni.

            Alta modalitate de inchidere a unei ferestre este prin incercarea de inchidere direct a acelei ferestre (fara a actiuna direct asupra procesului creator). Acest lucru nu este posibil tot timpul, cea mai sigura metoda de a inchide un proces fiind de a actiona direct asupra procesului creator. Totusi, daca se doreste incercarea acestei metode se selecteaza o fereastra din lista si se actioneaza butonul “Close prog”. Acesta va genera trimiterea unei cereri de inchidere a ferestrei respective. Inchiderea programului de pe calculatorul aflat la distanta nu se reflecta imediat in lista de ferestre din ListView. Pentru a obtine schimbarile aparute datorita inchiderii procesului selectat trebuie downloadata din nou lista de ferestre deschise (prin aceasta operatie vechea lista de procese va fi suprascrisa cu noua lista de ferestre) si trebuie afisata aceasta.
Obtinerea si vizualizarea informatiilor despre ferestre :



Oprirea unui program/proces asociat cu o fereastra :



                Operatiile de vizualizare si inchidere a unui program/proces asociat ferestrei sunt cele mai importante dar nu sunt singurele disponibile utilizatorului. In afara de acestea, utilizatorul are la dispozitie si urmatoarele operatii :

-          Schimbarea starii activat/dezactivat a unei ferestre. In momentul in care o fereastra trece in starea de dezactivare, aceasta nu mai primeste input de la utilizatorul sistemul gazda pe care ruleaza serverul (inputul care vine de exemplu de la tastatura sau de la mouse). Pentru a realiza trecerea in starea de dezactivare, se selecteaza o fereastra din lista si se actioneaza butonul “Disable window”. Acesta va genera trimiterea catre server a unei cereri de dezactivare, alaturi de identificatorul ferestrei pentru care se doreste dezactivarea. Pentru a activa o fereastra, se selecteaza o fereastra din lista si se actioneaza butonul “Enable window”. Acesta va genera trimiterea catre server a unei cereri de activare, alaturi de identificatorul ferestrei pentru care se doreste activarea. Serverul va executa comanda trimisa de client, fapt vizibil imediat pe masina gazda a serverului.
-          Schimbarea starii de minimizare/vizualizare a unei ferestre. O fereastra poate fi minimizata sau maximizata si cu ajutorul acestei comenzi, aceasta poate trece intre cele doua stari. Pentru a realiza trecerea in starea de minimizare, se selecteaza o fereastra din lista si se actioneaza butonul “Minimize window”. Acesta va genera trimiterea catre server a unei cereri de minimizare, alaturi de identificatorul ferestrei pentru care se doreste minimizarea. Pentru a afisa o fereastra, se selecteaza o fereastra din lista si se actioneaza butonul “Show window”. Acesta va genera trimiterea catre server a unei cereri de afisare, alaturi de identificatorul ferestrei pentru care se doreste afisarea. Serverul va executa comanda trimisa de client, fapt vizibil imediat pe masina gazda a serverului.
-          Schimbarea numelui unei ferestre. Fiecare fereastra are un titlu afisat in bara de sus. Acest nume este chiar numele prin care este identificata fiecare fereastra in ListView-ul din partea dreapta a ferestrei. El poate fi schimbat printr-o comanda trimisa serverului. Pentru a realiza schimbare titlului, se selecteaza o fereastra din lista, se scrie noul nume in casuta de text din partea stanga-sus a ferestrei si se actioneaza butonul “Change caption”. Acesta va genera trimiterea catre server a unei cereri de schimbare a numelui, alaturi de identificatorul ferestrei pentru care se doreste schimbarea numelui. Serverul va executa comanda trimisa de client, fapt vizibil imediat pe masina gazda a serverului.
-          Schimbarea formei ferestrei. Aceasta facilitate este mai mult pentru a arata ca acest lucru este posibil. Astfel, unei ferestre ii poate fi schimbata forma intr-un mod arbitrat. Ca sa exemplific, in acest caz va capata o forma rotunda/ovala. Pentru a schimba forma unei ferestre, se selecteaza o fereastra din lista si se actioneaza butonul “Create round rgn”. Acesta va genera trimiterea catre server a unei cereri de schimbare a formei ferestrei, alaturi de identificatorul ferestrei pentru care se doreste modificarea formei. Serverul va executa comanda trimisa de client, fapt vizibil imediat pe masina gazda a serverului.
                O alta facilitate pusa la dispozitie de program este cautarea ferestrei ce contine un anumit cuvant in titlu intre ferestrele deschise pe sistemul gazda al serverului. Clientul afisaza lista de ferestre si informatii despre ele in fereastra din partea dreapta. Pentru a cauta fereastra care contine un anumit cuvant se scrie cuvantul dorit in casuta de text de sub butonul “Search word” si se actioneaza butonul mentionat anterior. Aceasta actiune va genera selectarea primei ferestre care contine in titlu cuvantul scris in casuta de text.

            Aceasta facilitate este importanta in momentul in care sunt deschise multe ferestre pe sistemul gazda si se doreste gasirea uneia in particular.
2.7 Optiunile disponibile din meniul de distractie (fara o folosinta practica deosebita)

Acest meniu ofera mai multe functii a caror importanta este scazuta, dar care au fost implementate din dorinta de a arata ca se poate :

-          Functia de trimitere a unui mesaj catre utilizatorul sistemului pe care este instalat serverul. In casuta de text aflata deasupra butonului “Send message” se poate introduce un text arbitrar, care la apasarea butonului mentionat anterior este trimis catre server, alaturi de o cerere a afisare intr-un message box. Serverul proceseaza cererea si afisaza mesajul dorit intr-un message box avand decat optiunea “ok”. Titlul message box-ului este “Mesaj informativ” si va aparea in prim plan.
-          Functia de inchidere a calculatorului pe care ruleaza serverul. Calculatorul pe care ruleaza serverul poate fi inchis de la distanta. Daca se doreste acest lucru, este necesar decat sa se actioneze butonul “Shut down”. Rezulta trimiterea unei cereri de oprire catre server. Acesta la randul sau proceseaza cererea si apeleaza functia de sistem ce genereaza oprirea fortata a calculatorului. Rezultatul acestei functii este oprirea calculatorului gazda al serverului, deci implicit inchiderea serverului si intreruperea conexiunii. In concluzie, folositi aceasta functionalitate doar daca nu mai aveti nevoie de calculatorul aflat la distanta.
-          Functia de inchidere/deschidere a cd-rom/dvd-rom –ului. Clientul poate trimite serverului o comanda care genereaza inchiderea sau deschiderea usitei cd-rom/dvd-rom –ului. Pentru unitatile optice normale (cu motoras care actioneaza tavita de suport), sunt disponibile ambele functii (deschidere si inchidere). Pentru unitatile optice fara motoras de actionare a tavitei este disponibila  doar functia de deschidere, functia de inchidere neavand nici un rezultat (deoarece necesita actionare manuala). Pentru a trimite aceste comenzi se actioneaza butoanele “Open” si “Close” ; primul, dupa cum sugereaza si numele, genereaza deschiderea usitei unitatii optice, iar cel de-al doilea inchiderea usitei.
-          Functii de manipulare a mouse-ului :

o       Functia de ascundere/afisare a mouseului. Clientul poate trimite catre server o comanda care rezulta in ascunderea mouse-ului utilizatorului. De asemenea exista si comanda inversa, de afisare a mouse-ului. Pentru a genera comanda de ascundere a mouse-ului se actioneaza butonul “Hide”. Va rezulta trimiterea unui mesaj catre server continand comanda de ascundere. Serverul proceseaza cererea si apeleaza o functie de sistem care are ca rezultat ascunderea mouse-ului (adica mouse-ul nu mai este desenat pe ecran). Pentru a genera comanda de afisare a mouse-ului se actioneaza butonul “Show”. Va rezulta trimiterea unui mesaj catre server continand comanda de afisare. Serverul proceseaza cererea si apeleaza o functie de sistem care are ca rezultat afisarea mouse-ului (adica mouse-ul este acum desenat pe ecran).
o       Functia de inversare/aducere la normal a functionalitatii butoanelor mouse-ului. Clientul poate trimite catre server o comanda care rezulta in inversarea functionalitatii butoanelor mouse-ului utilizatorului. De asemenea exista si comanda inversa, de aducere la normal a functionalitatii butoanelor mouse-ului. Pentru a genera comanda de inversare a functionalitatii butoanelor mouse-ului se actioneaza butonul “Invert”. Va rezulta trimiterea unui mesaj catre server continand comanda de inversare. Serverul proceseaza cererea si apeleaza o functie de sistem care are ca rezultat inversarea functionalitatii butoanelor mouse-ului (adica butonul stanga al mouse-ului actioneaza ca buton dreapta si butonul dreapta actioneaza ca buton stanga). Pentru a genera comanda de aducere la normal a functionalitatii butoanelor mouse-ului se actioneaza butonul “Restore”. Va rezulta trimiterea unui mesaj catre server continand comanda de aducere la normal a functionalitatii. Serverul proceseaza cererea si apeleaza o functie de sistem care are ca rezultat readucerea la normal a functionalitatii butoanelor mouse-ului (adica butonul stanga al mouse-ului actioneaza normal ca buton stanga si butonul dreapta actioneaza normal ca buton dreapta).
o       Functia de generare unui click stanga/dreapta a mouseului. Clientul poate trimite catre server o comanda care rezulta in generarea unui click stanga a mouse-ului. De asemenea exista si comanda de generare a unui click dreapta de mouse. Pentru a genera comanda de click stanga a mouse-ului se actioneaza butonul “Left Click”. Va rezulta trimiterea unui mesaj catre server continand comanda de click stanga la pozitia introdusa in casuta de text de sub textul “Place to click”. Serverul proceseaza cererea si apeleaza o functie de sistem care are ca rezultat un click stanga la pozitia transmisa de client in comanda. Pentru a genera comanda de click dreapta a mouse-ului se actioneaza butonul “Right Click”. Va rezulta trimiterea unui mesaj catre server continand comanda de click dreapta la pozitia introdusa in casuta de text de sub textul “Place to click”. Serverul proceseaza cererea si apeleaza o functie de sistem care are ca rezultat un click dreapta la pozitia transmisa de client in comanda.
o       Functia de generare a unei miscari random a mouseului. Clientul poate trimite catre server o comanda care rezulta in generarea unei miscari random a mouse-ului. Pentru a genera comanda de miscare random a mouse-ului se actioneaza butonul “Random mouse move”. Va rezulta trimiterea unui mesaj catre server continand comanda de miscare random a mouseului. Serverul proceseaza cererea, calculeaza noi coordonate pentru mouse (relative la pozitia la care se afla in acel moment mouseul calculatorului pe care ruleaza serverul) si apeleaza o functie de sistem care are ca rezultat setarea pozitiei mouseului la coordonatele dorite.
o       O facilitate interesanta este posibilitatea de controlare a mouse-ului calculatorului pe care ruleaza serverul. Aceasta se realizeaza prin trimiterea de pozitii succesive la care se doreste a fi pozitionat mouseul. Aceasta facilitate se activeaza in client prin bifarea optiunii “Control mouse”. In momentul bifarii, incepe formarea un vector cu pozitiile mouseului; cand ajunge la o anumita marime este trimis catre server, urmand sa se formeze un nou vector, si procesul se repeta. Durata de timp intre doua preluari succesive ale pozitiei mouse-ului calculatorului pe care ruleaza clientul este data de valoarea (in milisecunde) scrisa in casuta din dreapta checkbox-ului care activeaza controlul mouse-ului. Daca nu este introdusa o valoare sau valoarea este invaldida, se foloseste un interval de 20 ms. Odata ajuns la server, acesta extrage coordonatele succesive din vector si muta mouse-ul prin toate pozitiile.

o       In afara de posibilitatea de a controla mouse-ul, mai exista si posibilitatea de a actiuna prin click-uri in momentul controlului. Se procedeaza in felul urmator :  daca in momentul in care se bifeaza optiunea de control a mouse-ului este bifata si optiunea “Click option”, atunci va aparea in prim-plan o fereastra goala, care are rolul de a colecta click-urile utilizatorului. In momentul in care se face un click pe aceasta fereastra, pozitia la care s-a facut click este adaugata in vectorul de pozitii (alaturi de informatii suplimentare care arata ca la acea pozitie trebuie sa fie executat un click de mouse). Sa presupunem ca un vector continand astfel de pozitii unde trebuie facut click ajunge la server. Acesta, cand ajunge la o astfel de pozitie apeleaza o functie de sistem care conduce la executarea unui click la acea pozitie. Pentru a inchide fereastra ce intermediaza click-urile utilizatorului si a opri trimiterea click-urilor se foloseste Alt-F4.


Inainte de inchierea detaliilor de functionare, cateva cuvinte despre anumite caracteristici neacoperite ale serverului. La pornire acesta se “ascunde”, neaparand in meniul de programe, ci doar in cel cu procesele. De asemenea, se copiaza in directorul Windows-ului cu numele “ServerComunicare.exe” si se insereaza la startup, introducandu-se in 'Software\Microsoft\Windows\CurrentVersion\Run'. Astfel serverul va porni de fiecare data odata cu Windows-ul.

3. Detalii despre implementare :


            La pornirea serverului, sunt urmati anumiti pasi de initializare inainte sa se porneasca ascultarea pentru conexiuni.

            Mai intai este apelata functia “cautare_drive_pt_scriere”:

-           Aceasta are rolul de a gasi directorul temporar al sistemului pentru a scrie acolo fisierele ce necesita sa fie salvate temporar pe discul local, inainte de a fi trimise catre client (de exemplu rezultatul pentru functia de obtinere a informatiilor despre procese, sau imaginea curenta a desktopului). Alt rol este de a gasi calea din care a fost rulat programul.

-          Mai intai este folosita functia “GetTempPath” pentru a gasi directorul temporar al sistemul. In acest director se incearca crearea unui fisier pentru a vedea daca sunt drepturi de scriere. In caz ca se reuseste atunci directorul cautat este considerat gasit si se salveaza acest. Daca nu se reuseste crearea se iau la rand toate discurile logice si se incearca crearea de fisiere pe ele, in cautarea unui loc unde pot fi scrise fisierele temprorare necesare. In momentul in care este gasit un astfel de loc, este salvat.

-          Pentru a gasi calea de unde a fost lansat in executie programul se foloseste functia “getcurrentdirectory”, ce are rolul de a returna acest director, salvat apoi intr-o variabila globala.

Urmeaza functia “initializare”:

-          Aceasta are rolul de a crea un socket apeland functia de de constructie a socket-ului de tipul “TServerSocket”; socketului ii este asociat portul 1245

-          Dupa crearea socket-ului acesta este trecut in starea de ascultare si este initializat socketul curent conectat cu nil (la inceput nu este nici un socket conectat)

Dupa initializare, serverul este ascuns, apelandu-se functia “ascundere”:

-          In aceasta functie, in afara de ascunderea serverului, are loc si obtinerea adresei functiei “WNetEnumCachedPasswords” care se afla in “Mpr.dll”, librarie pentru care este necesara incarcarea

-          Astfel, la inceput se incearca incarcarea librariei “Mpr.dll”; daca se reuseste incarcarea acestei librarii se localizeaza adresa functiei “WNetEnumCachedPasswords” si se salveaza. In caz contrar adresa ramane necunoscuta si recuperarea parolelor nu va fi posibila

-          Dupa aceasta se incearca incarcarea librariei “Kernel32.dll”. Din aceasta librarie avem nevoie de functia “RegisterServiceProcess”. Aceasta functie este necesara ca un program sa se poata inregistra ca aplicatie de proces.  Daca Libraria se poate incarca si adresa functiei este gasita, aceasta se apeleaza si programul este inregistrat ca proces, ruland in fundal.

Alt pas important este inserarea la startup, in functia “inserare_startup”:

-          Pentru a fi inserat la startup, este nevoie de scrierea in registri a unei noi intrari ; nu este inregistrat pentru lansare chiar executabilul care a lansat aplicatia (sau cel putin nu prima data cand aceasta este lansata), ci un executabil copiat in directorul de instalarea al windows-ului sub numele “ServerComunicare.exe”

-          Mai intai executabilul care a lansat programul este copiat in directorul de instalarea al windowsului, cu numele specificat mai sus, fara suprascriere (in cazul in care aceasta este o rulare a programului care a fost copiat anterior acolo, deci chiar ServerComunicare.exe, nu mai este nevoie de o copiere suplimentara).

-          Urmeaza inserarea in registri. Este folosita functia “RegOpenKey” pentru a deschide registrul dorit, si anume “Software\Microsoft\Windows\CurrentVersion\Run”. In acest registru se pot adauga valori specificand programe care se vor lansa in executie la pornirea sistemul de operare. Aici se adauga o noua valoare identificata prin “ServerComunicare”, ce face ca serverul sa fie rulat la fiecare executie a Windows-ului.

Ultimul pas consta in intrarea in starea de primire a conexiunilor si a comenzilor :

-          Daca nu este un client conectat

o       socketul intra in starea de asteptare a conexiunilor

o       in momentul in care apare o cerere de conexiune, aceasta este acceptata

-          Daca exista un client conectat, atunci se asteapta primirea unei comenzi de la el

o       Se citesc 1024 de octeti din datele primite

o       Daca ne aflam in cursul unui upload, este apelata functia de procesare a datelor, “upload_proc”, pentru ca acestea sa fie scrise in fisier. Singura alternativa este anularea upload-ului, in cazul primirii comenzii “/cancelupload\” ; in aceasta situatie, fisierul este inchis, se iese din starea de uploadare si se trimite catre client un mesaj de confirmare a anularii upload-ului.

o       In caz contrar, exista mai multe comenzi posibile ce pot fi primite de la client. Serverul cauta urmatoarele comenzi :

§         “appkill”, caz in care este apelata functia de inchidere a unui program “kill_app”

§         “klproc”, caz in care este apelata functia de inchidere a unui proces, “kill_process”

§         “proc”, caz in care este apelata functia de obtinere a informatiilor despre procesele ce ruleaza, “get_processes”

§         “momv”, caz in care este apelata functia de procesare a unui vector de pozitii prin care trebuie trecut mouse-ul, “move_mouse”

§         “randommouse”, caz in care este apelata functia de generare a unei miscari random de mouse, “random_mouse_move”

§         “mousel”, caz in care este apelata functia de generare a unui click stanga la locatia specificata in comanda, “mouse_click” cu parametrul=0

§         “mouser”, caz in care este apelata functia de generare a unui click dreapta la locatia specificata in comanda, “mouse_click” cu parametrul=1

§         “swapm”, caz in care este apelata functia de schimbare a functionalitatii butoanelor mouse-ului, “swap_mouse_buttons” cu parametrul=0

§         “deswapm”, caz in care este apelata functia de aducere a functionalitatii butoanelor mouse-ului la normal, “swap_mouse_buttons” cu parametrul=1

§         “hdmouse”, caz in care este apelata functia de ascundere a mouse-ului, “hide_mouse” cu parametrul = 0

§         “swmouse”, caz in care este apelata functia de afisare a mouse-ului, “hide_mouse” cu parametrul = 1

§         “rgn”, caz in care este apelata functia de setare a formei unei ferestre, “set_window_rgn”

§         “enable”, caz in care este apelata functia de activare a unei ferestre, “enable_window”

§         “dissable”, caz in care este apelata functia de dezactivare a unei ferestre, “dissable_window”

§         “size”, caz in care este apelata functia de obtinere a marimii unui fisier, “file_size”

§         “scr”, caz in care este apelata functia de obtinere a unei poze e desktop-ului, “get_screen”

§         “swwindow”, caz in care este apelata functia de afisare a unei ferestre, “show_window”

§         “minimize”, caz in care este apelata functia de minimizare a unei ferestre, “minimize_window”

§         “changecap”, caz in care este apelata functia de schimbare a titlului unei ferestre, “schimba_caption_prog”

§         “closeapp”, caz in care  este apelata functia de inchidere a unui program, “inchide_prog”

§         “find”, caz in care este apelata functia de cautare a unui fisier pe toate discurile logice, “find_file”

§         “targetfind”, caz in care este apelata functia de cautare a unui fisier intr-o anumita cale, specificata in comanda, “find_target_file”

§         “get hand”, caz in care este apelata functia de obtinere a informatiilor despre ferestrele deschise, “get_handles”

§         “cached”, caz in care este apelata functia de recuperare a parolelor, “send_cached_passwords”

§         “rnfile”, caz in care este apelata functia de redenumire a unui fisier, “rename_file”

§         “crdir”, caz in care este apelata functia de creare a unui director, “create_dir”

§         “rmvdir”, caz in care este apelata functia de stergere a unui director, “remove_dir”

§         “crfis”, caz in care este apelata functia de creare a unui director, “create_fis”

§         “msg”, caz in care este apelata functia de afisare a unui mesaj informativ, “mesaj”

§         “drv”, caz in care este apelata functia de obtinere a partitiilor logice, “send_drivers”

§         “usitao”, caz in care este apelata functia de deschidere a usiteti unitatii optice, “open_cd”

§         “usitac”, caz in care este apelata functia de inchidere a usitei unitatii optice, “close_cd”

§         “shut down”, caz in care este apelata functia de inchidere a calculatorului, “shut_down”

§         “dir”, caz in care este apelata functia de trimitere a continutului unui director, “trimite_dir”

§         “decon”, caz in care conexiunea cu serverul este intrerupta, socketul clientului conectat devine nil si se intra din nou in starea de asteptare a unei conexiuni

§         “kill”, caz in care serverul este inchis; se seteaza “ext” pe true si se iese din bucla

§         “run”, caz in care se ruleaza un program specificat de client in comanda, in functia “run_prog”

§         “del”, caz in care se apeleaza functia de stergere a unui program, “del_file”

§         “copy”, caz in care se apeleaza functia de incepere a copierii unui fisier, “prel_copy”

§         “cpi”, caz in care se apeleaza functia de             trimitere de date in cadrul copierii unui fisier, “send_file” cu parametrul = 1

§         “PING”, caz in care se apeleaza functia de raspuns la ping, “PONG”

§         “upload”, caz in care se apeleaza functia de intrare in starea de uploadare, “prel_upload”

§         “upld”, caz in care se apeleaza functia de primire de date in cadrul unui upload, “upload_proc”

o       Daca apare o eroare la primirea datelor, clientul este deconectat si se reintra in starea de asteptare a unei conexiuni

-          Toate acestea se repeta atat timp cat variabila care anunta incheierea programului nu este setata pe pozitia de iesire

Pentru a micsora marimea serverului au extrase anumite functii din antete, alaturi de implementare si incluse in sursa. Acestea sunt functii necesare in interactiunea cu sistemul de fisiere, cum ar fi :

-          “DirectoryExists” -> aceasta primeste ca parametru calea unui director si returneaza o valoare Boolean care indica existenta acestuia

-          “LowerCase” -> aceasta primeste ca parametru un string si returneaza stringul respectiv in care toate literele sunt mici

-          “GetCurrentDir” -> returneaza un string cu directorul curent

-          “FindClose” -> primeste ca parametru un “TSearchRec” si inchide cautarea

-          “FindFirst” ->  primeste ca parametrii o cale si atributele unui fisier dorit si are ca iesire o variabila de tip TSearchRec in care intoarce rezultatele cautarii; aceasta functie sa apeleaza doar pentru inceperea cautarii

-          “FindNext” -> continua o cautare inceputa cu “FindFirst”; primeste ca parametru o variabila de tip TSearchRec in care returneaza urmatorul fisier gasit

-          “CreateDir” -> primeste ca parametru un string care reprezinta numele directorului care urmeaza sa fie creat

-          “RemoveDir” -> primeste ca parametru un string ce reprezinta numele directorului pentru sters; aceasta va esua daca directorul nu este gol

-          “FileCreate” -> primeste ca parametru nu string ce reprezinta numele fisierului care urmeaza sa fie creat

-          “FileClose” -> primeste ca parametru un handle asociat cu fisierul care trebuie inchis

-          “RenameFile” -> primeste doi parametrii : unul cu numele vechi al fisierului, si unul cu noul nume al fisierului

-          “FileAge” -> primeste ca parametru un string cu numele fisierului pentru care se doreste obtinerea varstei       si intoarce varsta fisierului

-          “FileExists” -> aceasta primeste ca parametru calea unui fisier si returneaza o valoare Boolean care indica existenta acestuia

-          “FileIsReadOnly” -> aceasta primeste ca parametru calea unui fisier si returneaza o valoare Boolean care indica daca este marcat ca  “doar pentru citire”

-          “FileSetReadOnly” -> aceasta primeste ca parametru calea si numele unui fisier si o variabila Boolean care se doreste a fi noua stare de readonly a fisierului returneaza o valoarea Boolean care indica daca daca operatia a avut succes

Pentru executarea multor functii este nevoie de asemenea de functii ajutatoare, care cu toate ca nu joaca un rol major, au partea lor de importanta :

-          “doar_fis” -> primeste ca parametru un string ce reprezinta cale+nume fisier si returneaza doar numele fisierului ca string

-          “win_dir” ->

o       returneaza directorul in care este instalat Windows

o       pentru aceasta foloseste functia “getwindowsdirectory”

o       are grija ca stringul returnat sa se termine mereu cu ‘\’

-          “bts” ->

o       Primeste ca parametru o variabila de tip TBufferText si 2 variabile de tip longint care indica indexul de inceput si indexul de sfarsit intre care literele vor fi adunate intr-un string

o       Returneaza un string format din literele dintre cei 2 indecsi dati ca parametrii

-          “stb” ->

o       Primeste ca parametrii o variabila de tip string si o variabila de tip TBufferText

o       Returneaza in variabila de tip TBufferText stringul separat in caractere

-          “dir_sg” ->

o       Primeste ca parametru un string ce reprezinta cale+fisier

o       Returneaza un string ce reprezinta doar calea

Operatiile principale ale serverului sunt executate de catre proceduri/functii apelate din functia principala de interceptare a comenzilor primite de la client. Acestea sunt :

-          “open_cd” -> trimite catre sistem comanda 'set cdaudio door open' , folosind functia de sistem “mcisendstringA”

-          “close_cd” -> trimite catre sistem comanda 'set cdaudio door closed', folosind functia de sistem “mcisendstringA”

-          “shut_down” -> duce la inchiderea sistemul pe care ruleaza serverul, folosind un apel al functiei “exitwindowsex”, cu parametrul “EWX_SHUTDOWN”

-          “trimite_dir” ->

o       Functia se ocupa cu trimiterea catre client a continutului unui director specificat in comanda

o       Operatia de trimitere se poate afla in 2 stari

§         Daca se afla la primul apel (in sensul in care nu este o operatie de listare de director deja pornita)

·        Se schimba directorul curent in cel specificat pentru listare si se obtine un identificator catre acesta

·        Se foloseste mai intai functia “findfirst” pentru a incepe listarea tuturor elementelor din director (alte directoare + fisiere)

·        Urmeaza folosirea functiei “findnext” pentru a lista totate elementele din director

·        Numele directoarelor si numele fisierelor sunt tinute in doua widestring-uri separate

·        Dupa ce toate directoarele si toate fisierele au fost obtinute, cele doua widestring-uri sunt concatenate, folosind caracterul #10 ca despartitor

·        Se apeleaza functia de trimitere a datelor despre continutul directorului catre client

§         Daca nu se afla la primul apel (adica o operatie de listare este deja pornita si sunt date de trimis catre client)

·        Se apeleaza direct functia de trimitere a datelor despre continutul directorului catre client

-          “trimite_dir2” ->

o       Dupa ce functia “trimite_dir” aduna datele pentru trimis, aceasta functie le trimite efectiv catre client

o       Sunt tratate 3 situatii, in functia de marimea datelor ramase pentru trimis :

§         Daca marimea curenta este mai mare decat 1019 caractere, atunci umple un buffer cu date pana la 1019 caractere, adauga antetul si trimite un pachet de 1024 de octeti

§         Daca marimea curenta este mai mica decat 1019 caractere, atunci pune datele ramase intr-un buffer, adauga antetul si il trimite catre client.

§         Daca nu mai sunt date de trimis, atunci trimite catre client un mesaj in care specifica faptul ca toate datele au fost trimise si operatia s-a incheiat

-          “run_prog” ->

o       Procedura se ocupa cu lansarea in executie a unui executabil specificat in cadrul comenzii

o       Extrage mai intai fisierul pentru executat din bufferul comenzii si dupaia apeleaza functia de sistem “shellexecuteA”, lansand in executie executabilul respectiv

-          “del_file” ->

o       Procedura se ocupa de stergerea unui fisier de pe discul locala, calea si numele fiind precizate in comanda

o       Mai intai se extrag calea si numele din comanda trimisa de catre client si se incearca stergerea

§         Daca aceasta reuseste, este trimis un mesaj de confirmare clientului, caruia ii este afisat un mesaj informativ referitor la faptul ca operatia s-a terminat cu succes.

§         Daca operatia nu reuseste (de exemplu fisierul nu exista, nu sunt drepturi suficiete sau este in uz), atunci clientului ii este trimis un mesaj informativ referitor la faptul ca operatia nu a putut fi executata.

o       Dupa aceasta testeaza cateva cazuri particulare de fisiere, si anume acelea folosite pentru a stoca intermediar datele unei operatii de obtinere de informatii, inainte sa fie downloadate de catre client. Acestea sunt :

§         “find.txt” -> folosit pentru a stoca rezultatele unei operatii de cautare pe discul local

§         “handles.txt” -> folosit pentru a stoca informatiile obtinute despre ferestrele deschise

§         “proc.dat” -> folosit pentru a stoca informatiile obtinute despre procesele care ruleaza

§         “graph.dat” -> folosit pentru a stoca imaginea curenta a desktop-ului in cadrul unei cereri de imagine

o       Cand se doreste stergerea fisierelor particulare de mai sus, acestea se cauta in directorul gasit la inceput in care sunt stocate toate fisierele temporare si se incearca stergerea loc.

§         Daca aceasta reuseste, este trimis un mesaj de confirmare clientului, caruia ii este afisat un mesaj informativ referitor la faptul ca operatia s-a terminat cu succes.

§         Daca operatia nu reuseste (de exemplu fisierul nu exista, nu sunt drepturi suficiete sau este in uz), atunci clientului ii este trimis un mesaj informativ referitor la faptul ca operatia nu a putut fi executata.

-          “PONG” ->

o       Procedura se ocupa cu trimiterea catre client a unui mesaj de raspuns pentru a semnala prezenta serverului

o       Nu face decat sa formeze un mesaj cu antetul “PONG” si sa-l trimita catre client

-          “send_drivers” ->

o       Pentru a naviga prin sistemul de fisiere al sistemului gazda al serverului, clientul are nevoie sa cunoasca literele asociate cu discurile logice de pe aceasta masina.

o       Procedura se ocupa cu obtinerea informatiilor despre literele asociate cu discurile logice de pe masina pe care ruleaza si trimiterea lor catre client

o       Mai intai se foloseste functia de sistem “GetLogicalDriveStrings”. Aceasta obtine si returneaza un vector de caractere reprezentand literele asociate pentru fiecare drive logic.

o       Urmeaza o triere a acestora, nefiind oportuna trimiterea catre client si a literelor asociate cu unitatile optice si dischetelor, putanda aparea erori la accesarea acestora.

o       Dupa triere informatia este stocata intr-un vector cu antetul “drv” si este trimisa catre client

-          “mesaj” ->

o       Procedura se ocupa cu afisarea unui mesaj informati catre utilizatorul calculatorului pe care ruleaza, textul fiind trimis de catre client in cadrul comenzii

o       Mai intai este extras textul care urmeaza sa formeze continutul text box-ului

o       Vrem ca acest text box sa fie afisat in prin plan, asa ca il vom crea ca fiind copilul ferestrei care se afla in prim-plan la momentul crearii.

o       Se obtine identificatorul ferestrei din prim-plan folosind functia “getforegroundwindow”, care returneaza handle-ul acesteia

o       Se creeaza text box-ul cu ajutorul functie de sistem “MessageBoxA” – functie declarata ca fiind externa din “user32.Dll”

-          “find_file” ->

o       Procedura se ocupa cu lansarea cautarii unui fisier pe toate discurile logice (prin apelarea functie “find_file2” pentru fiecare dintre acesta) si trimiterea unui mesaj informativ catre client la terminarea operatiei

o       Mai intai extrage numele fisierului care este cautat din comanda trimisa de client

o       Urmeaza crearea fisierului folosit pentru a stoca rezultatele cautarii, creare ce are loc in calea folosita pentru stocarea fisierelor temporare

o       Se foloseste “GetLogicalDriveStrings” pentru a  obtine un vector de caractere reprezentand literele asociate pentru fiecare drive logic.

o       Pentru fiecare litera care nu este asociata cu o unitate optica este lansata in executie procedura “find_file2”, care se ocupa de cautarea efectiva intr-o cale data si in toate subdirectoarele acesteia

o       Pe masura ce sunt gasite, rezultatele sunt stocate in fisierul deschis anterior in aceasta functie. Aceste fisier urmeaza sa fie downloadat de catre client ulterior, dupa ce primeste notificarea terminarii operatiei de cautare.

o       La terminarea executiei cautarii pentru fiecare din discurile logice, mesajul de notificare este trimis catre client. Mai intai un mesaj informativ ce va fi afisat utilizatorului si apoi un mesaj care va declansa downloadarea fisierului cu rezultate.

-          “find_target_file” ->

o       Procedura se ocupa cu lansarea cautarii unui fisier intr-o anumita cale data de catre client in comanda trimisa (prin apelarea functie “find_file2” pentru aceasta cale) si trimiterea unui mesaj informativ catre client la terminarea operatiei

o       Mai intai extrage numele fisierului care este cautat si calea in care este cautat din comanda trimisa de client

o       Urmeaza crearea fisierului folosit pentru a stoca rezultatele cautarii, creare ce are loc in calea folosita pentru stocarea fisierelor temporare

o       Pentru calea specificata este lansata in executie procedura “find_file2”, care se ocupa de cautarea efectiva intr-o cale data si in toate subdirectoarele acesteia

o       Pe masura ce sunt gasite, rezultatele sunt stocate in fisierul deschis anterior in aceasta functie. Aceste fisier urmeaza sa fie downloadat de catre client ulterior, dupa ce primeste notificarea terminarii operatiei de cautare.

o       La terminarea executiei cautarii pentru fiecare din discurile logice, mesajul de notificare este trimis catre client. Mai intai un mesaj informativ ce va fi afisat utilizatorului si apoi un mesaj care va declansa downloadarea fisierului cu rezultate.

-          “find_file2” ->

o       Procedura se ocupa de cautarea efectiva intr-o cale data si salvarea rezultatelor in fisierul deschis anterior in functia “find_file”

o       Se cauta in calea de pornire, apoi se iau la rand toate subdirectoarele pana la cel mai adanc nivel si se cauta si in acestea

o       Pentru o cale se foloseste functia  “findfirst” pentru a gasi fisierele care corespund cerintei clientului, urmand a se folosi “findnext” pentru a gasit toate fisierele corespunzatoare

o       In momentul in care un fisier este gasit, rezultatul este salvat in fisier (calea si numele fisierului gasit)

o       Urmeaza o parcurgere a tuturor directoarelor din aceasta cale. Acestea sunt adaugate intr-o coada simulata printr-un vector, urmand sa fie verificate cand le vine randul

o       In momentul in care coada ajunge la 10000 de elemente, aceasta este “scurtata” prin mutarea elementelor la stanga, peste cele deja folosite

o       Mai intai este folosita functia “findfirst” pentru a gasit primul director, care este adaugat in coada. Dupa asta este folosita functia “findnext” pentru a gasit toate celelalte directoare, acestea fiind la randul lor adaugate in coada.

-          “create_dir” ->

o       Procedura se ocupa de crearea unui nou director, al carui nume este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga numele directorului care se doreste creat; acesta este trimis de catre client, alaturi de calea pentru creare

o       Pentru creare se foloseste functia “CreateDir”; aceasta primeste ca parametru calea+numele si returneaza o variabila Boolean care indica daca acesta a fost sau nu creat

o       In functie succesul in insuccesul in crearea directorului este trimis catre client un mesaj informativ care ii indica acestuia ce s-a intamplat

-          “remove_dir” ->

o       Procedura se ocupa de stergerea unui director, al carui nume este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga numele directorului care se doreste sters; acesta este trimis de catre client, alaturi de calea pentru stergere

o       Pentru stergere se foloseste functia “RemoveDir”; aceasta primeste ca parametru calea+numele si returneaza o variabila Boolean care indica daca acesta a fost sau nu sters; un director poate fi sters decat daca este gol in momentul apelarii functiei

o       In functie succesul in insuccesul in crearea directorului este trimis catre client un mesaj informativ care ii indica acestuia ce s-a intamplat

-          “create_fis” ->

o       Procedura se ocupa de crearea unui nou fisier, al carui nume este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga numele fisierului care se doreste creat; acesta este trimis de catre client, alaturi de calea pentru creare

o       Pentru creare se foloseste functia “FileCreate”; aceasta primeste ca parametru calea+numele si returneaza o variabila Boolean care indica daca acesta a fost sau nu creat

o       In functie succesul in insuccesul in crearea fisierului, este trimis catre client un mesaj informativ care ii indica acestuia ce s-a intamplat

-          “rename_file” ->

o       Procedura se ocupa de redenumirea unui fisier, al carui nume este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga numele fisierului care se doreste redenumit, alaturi de noul nume; acestea sunt trimise de catre client, alaturi de calea in care se afla

o       Pentru creare se foloseste functia “RenameFile”; aceasta primeste ca parametru calea+numele vechi si noul nume si returneaza o variabila Boolean care indica daca acesta a fost sau nu redenumit

-          “send_cached_passwords” ->

o       Procedura se ocupa de obtinerea parolelor RAS si apelarea functiei de trimitere

o       Trateaza trei cazuri :

§         Daca operatia de obtinere a parolelor nu a fost pornita, atunci

·        Se verifica mai intai daca s-a reusit obtinerea adresei functiei “WNetEnumCachedPasswords”, necesara pentru obtinerea parolelor

·        Pentru obtinerea parolelor se apeleaza functia “WNetEnumCachedPasswords”; aceasta primeste ca parametru o functie de callback, apelata pentru a-i fi pasate parolele ; apelul “WNetEnumCachedPasswords” poate esua daca nu este logat nici un user, caz in care se trimite catre client un mesaj informativ despre eroarea aparuta

·        In cazul in care functia reuseste dar nu se gaseste nici o parola, este trimis catre client un mesaj informativ

·        Daca este gasita cel putin o parola este apelata functia de trimitere a acestora catre client

§         Daca operatia de obtinere a parolelor a fost deja pornita, atunci se apeleaza functia de trimitere a acestora catre client

§         Daca operatia de obtinere a parolelor a fost deja pornita si au fost trimise toate parolele, se trimite catre client un mesaj prin care este anuntat ca toate parolele au fost trimise

-          “expediaza_cached_passwords” ->

o       Procedura se ocupa cu trimiterea parolelor obtinute catre client, in pachete de maxim 1024 octeti (incluzand antetul)

o       Se iau inregistrarile la rand si se incearca introducerea lor in mesajul pentru trimis (daca mai este loc)

o       Dupa umplerea mesajului curent, acesta este trimis catre client

o       Daca s-au trimis toate inregistrarile, atunci acest lucru este semnalizat prin valoarea contorului, care devine “-1”, urmanda ca urmatorul pachet sa semnalizeze terminarea procesului

-          “AddPassword” ->

o       Functia de callback apelata de catre sistem pentru a-i fi pasate inregistrarile cu parolele utilizatorului curent

o       Din inregistrare sunt extrase userul si parola si sunt inserate in vectorul de inregistrari extrase care urmeaza sa fie procesat si trimis catre client

-          “get_handles” ->

o       Procedura se ocupa de obtinerea informatiilor despre ferestrele deschise pe calculatorul gazda al serverului, fisiere ce sunt salvate in fisierul “handlex.txt” din directorul de stocare al fisierelor temporare, trimitand la sfarsit un mesaj de catre client

o       Mai intai este creat fisierul “handles.txt”; in cazul in care exista si contine ceva, este suprascris

o       Pentru a obtine identificatorii ferestrelor este folosita functia de sistem “enumwindows”; aceasta primeste ca parametru adresa unei functii folosite ca functi de callback; functia de callback primeste informatiile despre identificatori.

o       Dupa ce operatia de obtinere a informatiilor este terminata,  se trimite catre client un mesaj informativ ce va fi afisat utilizatorului

o       Ultimul mesaj trimis de aceasta procedura indica clientului ca fisierul a fost downloadat si se poate lansa cererea de downloadare

-          “enum_windows”->

o       Functia de callback a carei adresa este daca functiei de sistem “enumwindows”

o       Aceasta primeste handle-urile ferestrelor, obtine informatiile despre ele si le salveaza

o       Mai intai foloseste functia “getparent” pentru a obtine identificatorul ferestrei parinte

o       Se obtine apoi lungimea textului ce reprezinta titlul ferestrei cu ajutorul functiei “getwindowtextlength”

o       Cunoscand marimea, se foloseste “getwindowtext” pentru a obtine textul ce reprezinta titlul

o       Dupa ce toate datele despre o fereastra sunt stranse, acestea sunt scrise in fisierul “handlex.txt”, deschis anterior in procedura “get_handles”

-          “inchide_prog” ->

o        Procedura se ocupa de inchiderea unui program , al carui handle este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga handle-ul programului care se doreste inchis; acesta este trimis de catre client

o       Pentru inchidere se foloseste functia “sendmessage”; aceasta primeste ca parametru handle-ul unui program catre care se va trimite un mesaj dat ca parametru;  pentru aceasta situatie se trimite mesajul “WM_CLOSE” care cauzeaza inchiderea

-          “schimba_caption_prog” ->

o       Procedura se ocupa de schimbarea numelui unei ferestre , al carui handle este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga handle-ul ferestrei al carei titlu trebuie schimbat si noul titlu care trebuie pus; acestea sunt trimise de catre client odata cu comanda

o       Pentru schimbarea titlului se foloseste functia “setwindowtext”; aceasta primeste ca parametru handle-ul unui ferestre si noul titlu dorit pentru ea

o       Titlul va reveni totusi la valoarea initiala dupa un refresh

-          “show_window” ->

o       Procedura se ocupa de afisarea in prim-plan a  unei ferestre , al carui handle este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda

o       Pentru a executa comanda clientului sunt folosite succesiv mai multe functii de sistem :

§         Mai intai “showwindow”, careia ii sunt dati ca parametrii identificatorul ferestrei si “SW_SHOWMINIMIZED”, cu rolul de a minimiza mai intai fereastra

o       Urmeaza tot un apel catre “showwindow”, careia ii sunt dati ca parametrii identificatorul ferestrei si de data aceasta “SW_ SW_SHOWMAXIMIZED”, cu rolul de a maximiza fereastra

o       Ultimul apel este catre functia de sistem “setforegroundwindow”, care primeste ca parametru identificatorul ferestrei si are rolul de a seta fereastra din prim-plan

-          “minimize_window” ->

o       Procedura se ocupa minimizarea unei ferestre , al carui handle este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda

o       Pentru a minimiza fereastra este folosita functia de sistem “closewindow”, care primeste ca parametru identificatorul ferestrei pentru minimizat

-          “get_screen” ->

o       Procedura se ocupa de obtinerea unei imagini a ecranului sistemului pe care ruleaza serverul

o       Pentru a obtine un raport favorabil marime/calitate imagine, sunt folosite fisiere jpeg pentru a retine imaginea desktopului

o       Pentru a crea un jpg este nevoie de libraria “graph.dll”; aceasta trebuie plasata in directorul de instalare al windows-ului, fiind cautata acolo de catre program

o       Mai intai se incearca incarcarea librariei folosind functia de sistem “loadlibraryex”

o       Daca libraria nu este gasita, imaginea nu este creata si este trimis catre client un mesaj care-l informeaza de acest impediment

o       Daca libraria este gasita :

§         Pentru crearea jpg-ului este folosit un procent de compresie, care poate fi optinonal dat de catre client

§         Procesul de compresie este extras din comanda trimisa de client;  daca nu este un numar valid sau este mai mic decat 1 sau mai mare decat 100, se foloseste valoarea standard “20”

§         Urmeaza obtinerea adresei procesului “scrreal”; aceasta adresa este obtinuta folosind functia de sistem “getprocaddress”

§         Daca aceasta adresa este gasita, este apelata functia de obtinere a imaginii ecranului, care primeste ca parametrii procentul pentru compresie si calea+numele fisierului in care aceasta imagine va fi stocata

§         In cazul in care imaginea este obtinuta cu succes si salvata in fisierul indicat, este trimis catre server un mesaj care ii indica faptul ca procesul a luat sfarsit si poate comanda downloadarea imaginii obtinute

-          “send_file” ->

o       Functie folosita pentru trimiterea datelor dintr-un fisier catre client

o       Mai intai citeste din fisier 1024 de octeti folosind functia “blockread” si apoi ii trimite catre client

o       Daca au fost cititi mai putini de 1024 octeti, inseamna ca acesta a fost ultimul pachet din fisier si este inchis

-          “prel_copy” ->

o       Procedura se ocupa de pregatirile dinaintea inceperii trimiterii de date in cadrul unei operatii de copiere a unui fisier

o       Mai intai este extrasa calea+numele fisierului pe care clientul doreste sa-l downloadeze

o       Daca fisierul este unul dintre cele folosite pentru stocarea intermediara a rezultatelor unei operatii (‘find.txt’, ‘handles.txt’, ‘proc.dat’, ‘graph.jpg’), atunci este adaugata calea catre ele, si anume calea folosita pentru stocarea fisierelor intermediare calculata la pornirea serverului

o       Urmeaza verificarea existentei fisierului

§         Daca acesta nu exista, se trimite catre client un mesaj informativ prin care este anuntat de faptul ca fisierul nu exista

§         Daca acesta exista

·        Mai intai se asigura faptul ca fisierul nu este “readonly”; se obtine aceasta stare prin apelul functiei “fileisreadonly”; in caz afirmativ, se apeleaza functia “filesetreadonly” pentru a seta aceasta propietate la valoarea false

·        Se apeleaza functia “findfirst” avand ca parametru exact fisierul dorit; aceasta il va gasi intotdeauna, avand in vedere ca existenta a fost testata anterior. Prin acest apel se obtin informatii despre fisier.

·        Se trimite catre client un mesaj cu marimea fisierului dorit pentru downloadare, astfel incat acesta sa stie cat mai are de primit si pentru a folosi bara de progres a downloadarii

·        Se deschide fisierul si se apeleaza functia “send_file” pentru a incepe trimiterea datelor catre client

-          “prel_upload” ->

o       Procedura se ocupa de pregatirile dinaintea inceperii primirii de date in cadrul unei operatii de uploadare a unui fisier

o       Mai intai este extrasa calea+numele fisierului pe care clientul doreste sa-l uploadeze

o       Se incearca crearea fisierului in calea specificata

o       Se verifica apoi existenta fisierului cu ajutorul functie “fileexists”

§         Daca acesta nu exista inseamna ca nu au fost drepturi suficiente pentru crearea acestuia si se trimite catre client un mesaj informativ prin care este anuntat ca uploadarea nu poate avea loc deoarece fisierul nu poate fi creat in calea specificata

§         Daca acesta exista se trece in starea de uploadare (in care toate datele primite vor fi scrise in fisierul creat anterior) si se trimite catre client un mesaj prin care este anuntat ca poate incepe trimiterea de date


-          “upload_proc” ->

o       Procedura apelata pentru a primi si pentru a scrie datele primite de la un client in cadrul unei operatii de uploadare

o       Datele primite de la client sunt scrise in fisierul deschis anterior de functia “prel_upload”

o       Daca marimea primita pana acum este mai mica decat marimea totala care trebuie primita, atunci este trimis catre client un mesaj prin care este anuntat ca poate trimite urmatorul pachet de date

o       In cazul in care s-au primit toate datele asteptate, fisierul pentru upload este inchis, se iese din starea de uploadare si se pot primi alte date

-          “file_size” ->

o       Procedura apelata in momentul in care serverul primeste o cerere de aflare a marimii unui fisier

o       Mai intai extrage numele fisierului primit ca parametru al comenzii

o       Este apelata functia “findfirst” pentru a gasit fisierul si informatiile despre el (acesta este cautat exact in calea in care este plasat, fiind gasit de functie intotdeauna)

o       Este extrasa marimea fiserului si este calculata si marimea in KB

o       De asemenea, este inclusa si informatia despre starea flag-ului “readonly”

o       Este trimis catre client un pachet continand informatiile extrase anterior

-          “enable_window” ->

o       Procedura se ocupa activarea unei ferestre , al carui handle este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda

o       Pentru a activa fereastra este folosita functia de sistem “enablewindow”, care primeste ca parametrii identificatorul ferestrei pentru activat si daca sa o activeze sau sa o activeze

-          “dissable_window” ->

o       Procedura se ocupa dezactivarea unei ferestre , al carui handle este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda

o       Pentru a dezactiva fereastra este folosita functia de sistem “enablewindow”, care primeste ca parametrii identificatorul ferestrei pentru activat si daca sa o activeze sau sa o activeze

-          “set_window_rgn” ->

o       Procedura se ocupa setarea formei unei ferestre , al carui handle este dat de catre client in comanda trimisa

o       Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda

o       Se obtine forma curenta a ferestrei folosind functia “getwindowrect”

o       Aceasta forma este modificata pentru a crea o regiune eliptica folosind functia “createellipticrgn”

o       Regiunea eliptica creata este aplicata ferestrei folosind functia “setwindowrgn”

-          “hide_mouse” ->

o       Procedura se ocupa afisarea/ascunderea mouseului

o       Daca parametrul apelului indica ascunderea, atunci este apelata functia “showcursor” cu parametrul “false”, indicand sistemului sa nu mai afiseze mouse-ul

o       Daca parametrul apelului indica afisarea, atunci este apelata functia “showcursor” cu parametrul “true”, indicand sistemului sa afiseze mouse-ul

-          “swap_mouse_buttons” ->

o       Procedura se ocupa inversarea/resetarea functionalitatii butoanelor mouseului

o       Daca parametrul apelului indica inversarea, atunci este apelata functia “swapmousebutton” cu parametrul “true”, indicand sistemului sa interschimbe functionalitatea butoanelor mouse-ului

o       Daca parametrul apelului indica resetarea, atunci este apelata functia “swapmousebutton” cu parametrul “false”, indicand sistemului sa reseteze functionalitatea butoanelor mouse-ului

-          “mouse_click” ->

o       Procedura se ocupa de actionarea unui click stanga/dreapta la o anumita pozitie a mouse-ului, in functie de parametrii comenzii

o       Mai intai sunt extrase coordonatele pe axa x si pe axa y la care trebuie efectuat click-ul

o       Daca parametrul apelului indica un click stanga, atunci :

§         Este apelata mai intai functia “setcursorpos” pentru a seta mouse-ul la pozitia specificata de client

§          Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTDOWN”, pentru a genera apasarea butonului stanga al mouse-ului

§         Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTUP”, pentru a genera eliberarea butonului stanga al mouse-ului

o       Daca parametrul apelului indica un click dreapta, atunci :

§         Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_RIGHTDOWN”, pentru a genera apasarea butonului dreapta al mouse-ului

§         Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_RIGHTUP”, pentru a genera eliberarea butonului dreapta al mouse-ului

-          “random_mouse_move” ->

o       Procedura se ocupa de generarea unei miscari “random” a mouse-ului

o       Pentru a simula acest lucru se apeleaza functia “mouse_event” cu parametrul “MOUSEEVENTF_MOVE” si 100,100 pentru a genera mutarea pe axa x si y cu cate 100 de pixeli

-          “move_mouse” ->

o       Procedura se ocupa de miscarea si evetual executarea de click-uri a mouse-ului pe ecranul calculatorului gazda al serverului in cadrul unei operatii de controlare a mouse-ului

o       Este parcurs tot vectorul de mutari si click-uri :

§         Mai intai este extrasa pozitia unde se va muta mouse-ul (si eventula se va da click)

§         Se pozitioneaza mouse-ul la acea pozitie folosind functia “setcursorpos”

§         Daca trebuie efectuat si un click la acea pozitie :

·        Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTDOWN”, pentru a genera apasarea butonului stanga al mouse-ului

·        Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTUP”, pentru a genera eliberarea butonului stanga al mouse-ului

-          “get_processes” ->

o       Procedura se ocupa de obtinerea informatiile despre procesele care ruleaza pe calculatorul gazda al serverului, salvarea acestora intr-un fisier intermediar si trimiterea catre server a unui mesaj care semnalizeaza sfarsitul taskului

o       Functiile de sistem necesare pentru a obtine aceste informatii se afla in libraria “kernel32.dll”. Aceasta este incarcata la inceputul procedurii. Daca nu se reuseste, executia procedurii nu mai continua.

o       Din aceasta librarie sunt folosite trei functii :

§         “CreateToolhelp32Snapshot” – aceasta functie creaza un snapshot al proceselor curente ce ruleaza si returneaza un handle catre acest snapshot

§         “Process32First” – aceasta functie returneaza porneste iterarea unui snapshot si returneaza prima inregistrare

§         “Process32Next” – aceasta functie continua iterarea si returneaza urmatoarea inregistrare

o       Astfel mai intai se creeaza un snapshot si se obtine un handle catre el, folosind “CreateToolhelp32Snapshot”

o       Se creaza un fisier in care se vor retine intermediar rezultatele obtinute, urmand ca acesta sa fie downloadat de catre client

o       Se foloseste functia “Process32First” pentru a porni iterarea si a obtine prima inregistrare, ale carei informatii despre nume, id si parinte sunt scrise in fisier

o       Se foloseste functia “Process32Next” pentru a lista toate celelalte inregistrari (mai sunt inregistrari cat timp functia returneaza true), informatiile despre nume, id si parinte fiind scrise in fisier

o       La sfarsit este trimis catre client un mesaj prin care este informat ca informatiile au fost obtinute si salvate, iar acum poate emite cererea de downloadare a fisierului cu rezultate

-          “kill_process” ->

o       Procedura este apelata cand serverul primeste comanda de oprire a unui proces

o       Mai intai extrage identificatorul procesului pentru oprit, identificator ce vine odata cu comanda

o       Este folosita functia “openprocess” pentru a deschide procesul pentru terminare (prin specificarea parametrului “PROCESS_TERMINATE”)

o       Rezultatul functiei este folosit in apelul functiei “terminateprocess”, pentru a termina executia procesului

-          “kill_app” ->

o       Functia este folosita pentru inchiderea procesului asociat cu o anumita fereastra, in comanda fiind primit identificatorul ferestrei

o       Mai intai extrage identificatorul ferestrei din comanda primita

o       Translateaza identificatorul ferestrei in identificatorul procesului asociat folosind functia  “GetWindowThreadProcessID”

o       Este folosita functia “openprocess” pentru a deschide procesul pentru terminare (prin specificarea parametrului “PROCESS_TERMINATE”)

o       Rezultatul functiei este folosit in apelul functiei “terminateprocess”, pentru a termina executia procesului
4. Concluzii si dezvoltari ulterioare

            In acest domeniu, alte programe (de exemplu “UltraVnc”), aduc facilitati cum ar fi

-          Controlul in real-time al operatiilor de pe calculatorul aflat la distanta prin vizualizarea in real-time a ecranului si controlul real-time a mouse-ului si tastaturii

-          Folosirea unui sistem sofisticat de codare a datelor schimbate intre client si server

-          Posibilitatea de char intre utilizatorii celor doua calculatoare conectate

-          Autentificarea utilizatorilor care doresc sa se conecteze la server

-          Suport pentru monitoare multiple
Programul dezvoltat si prezentat in aceasta lucrare nu isi propune sa concureze cu programele deja existente pe piata, acest lucru fiind practic imposibil datorita volumului de munca si resurse umane aflate in spatele lor.

Totusi, isi propune sa demonstreze conceptele de baza ale unui sistem de control la distanta si sa ofere utilizatorului posibilitatea de a interactiona cu sistemul gazda al serverului in cat mai multe feluri.

Spre deosebire de programele comerciale, acesta pune la dispozitie un control mai fin al resurselor sistemului :

-          Manipularea identificatorilor ferestrelor deschise cu multiple optiuni

-          Vizualizarea si manipularea proceselor

Starea actuala a programului permite dezvoltari multiple, cum ar fi :

-          Adaugarea unui sistem de logare, astfel incat utilizatorii sa nu poata accesa fara aprobare serverul si sistemul pe care ruleaza acesta

-          Implementarea rularii diferitelor operatii ale serverului pe mai multe threaduri

-          Posibilitatea de a controla in totalitate sistemul gazda al serverului, fiind nevoie de adaugarea facilitatii de vizualizare in real-time a ecranului utilizatorului si de controlul tastaturii
5. Bibliografie

[1] Andrew S. Tanenbaum – “Computer Networks” , ISBN 0-13-066102-3

[2] Andrew S. Tanenbaum – “Modern Operating Systems” , ISBN 0-13-031358-0

[3] Marco Cantu – “Mastering Delphi 6”, ISBN: 0782128742

[4] Rachele, Warren  - “Learn Object Pascal with Delphi” , ISBN: 1556227191

[5] www.freebyte.com/programming/delphi/

[6] www.festra.com/freetutor/ - tutoriale programare Delphi

[7] www.drbob42.com/ - informatii tehnice despre programarea in Delphi

[8] forums.devshed.com/delphi-programming-90/ - forumuri de discutii despre programarea in Delphi

[9] www.tolderlund.eu/delphi/ - informatii si tutoriale Delphi

[10] www.delphi-central.com/

1. Курсовая Анализ финансового состояния организации 15
2. Реферат на тему Blindness In King Lear Essay Research Paper
3. Курсовая на тему Разработка технического решения по сопряжению локальных вычислительных сетей
4. Биография Уэрта, Викториано
5. Реферат Суриковский литературно-музыкальный кружок
6. Реферат на тему Marketing Boards Essay Research Paper IntroductionMarketing Boards
7. Реферат Приемы связи пресс-службы со СМИ
8. Реферат на тему Суннизм и Шиизм
9. Реферат Проект организации работ
10. Контрольная работа Жизненный цикл товара на рынке, стратегии маркетинга по ходу жизненного цикла товара