Sunteți pe pagina 1din 9

www.cartiaz.

ro – Carti si articole online gratuite de la A la Z

COMUNICAREA CU AJUTORUL MESAJELOR PRIN


INTERMEDIUL REŢELELOR BAZATE PE SETUL DE PROTOCOALE
TCP/IP

1.1 Internet şi serviciile de Internet Paging

Aplicatiile ce oferă ecest tip de servicii pot avea diferite arhitecturi. În


majoritatea cazurilor exista un program server ce efectuiază unele lucrări de
gestionare a clienţilor ei. Lucrările de le execută depinde în mare măsură de
principiul ce stă la baza aplicaţiei. Aplicaţia poate folosi diferite tipuri de
protocoale. Cel mai des folosit este UDP însă uneori se folosesc şi alte tipuri de
protocoale ca de exemplu TCP. Ajunsurile şi neajunsurile acestor pagere evident se
moştenesc de la caracteristicile protocoalelor folosite. Ca de exemplu folosind
protocolul UTP, de regulă mesajele se transmit destul de rapid, însă acest protocol
nu ne garantează ajungerea la destinaţie a mesajului transmis. Protocolul TCP ne
garanteza acest lucru, însă de regulă pagerele bazate pe acest protocol sînt destul
de lente.
Pentru a comunicarea programului server cu programele clienţi e nevoie de a
crea canale de legătură. Există mai multe posibilităţi de a crea canale de legatură
cum ar fi de exemplu cu ajutorul NetBEUI, Window Sockets sau Pipes.

1.2 Principiile creării legăturilor ale aplicaţiilor prin reţea cu ajutorul


Window Socket.
Toate aplicaţiile de reţea se împart în două categorii: Programe Client şi
programe Server. Diferenţele între ele constă în modul după care se face legătura.
Programul Server trebuie să primească cererea de legătură de la programul Client,
iar programul Client trimite cererea de legătură programei Server şi aşteaptă
răspunsul. După aceste proceduri diferenţele dintre aceste două programe dispar.
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Între ele are loc un dialog, în care ambele programe sînt echivalente. Regulele
organizării dialogului sînt stabilite de un protocol. Între Server şi Client se crează
un canal de comunicare. Citirea şi scrierea se face cu ajutorul unor obiecte –
Socket.

Server

Socket

Client
Bind

Listen Socket

Stabilirea legăturii
Accept Conect

Transmiterea cerinţii
Receive() Send()

Transmiterea rezultatelor
Send() Receive()

Fig.1 Schema principială după care sînt construite aplicaţiile de reţea cu ajutorul Window Socket

Programul Client

Ciclul de lucru al unui program Client constă din următoarele etape:

1. Crearea Socket-ului. După creare se pot stabili careva parametri ai socket-


ului, de exemplu blocabil sau neblocabil.
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

2. Se uneşte socketul cu programul Server.


3. Se transmite o cerere programului Server.
4. Se primeşte răspunsul. Posibil aceste două puncte se repetă, în dependenţă
de tipul protocolului folosit.
5. Se închide socketul. În acelaşi timp se întrerupe legătura cu Serverul.
Programul Server

Ciclul de lugru al Server-ului constă din următoarele etape.

1. Crearea socket-ului.
2. Se uneşte socket-ul cu un port local(bind).
3. Se stabileşte socket-ul în regim de ascultare(listen).
4. Trece în regim de aşteptare a cererii(accept).
5. Citeşte cererea.
6. Scrie răspunsul.
7. Trece iarăşi în regim de aşteptare.

1.3 Lucrul cu Window Socket în Visual C++

1.3.1 Crearea Socket-ului

Pentru a crea un socket într-o aplicaţie în primul rînd e nevoie de a declara o


variabilă de tipul CAsincSocket (sau o clasă descendentă din CAsincSocket) ca o
membră a unei clase din aplicaţie.

class CMyDlg : public CDialog


{
private:
CAsyncSocket m_sMySocket;
};
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Înainte de a folosi obiectul socket, e nevoie de chemat metoda sa Create().


Această metodă crează socket-ul şi îl găteşte de întrebuinţare. Modul în care este
chemată metoda Create() depinde de modul de întrebuinţare a secket-ului. Dacă
socket-ul va fi folosit pentru unică folosinţă (la programul client), atunci nu este
nevoie de a-i pasa unii parametri metodei Create().
De exemplu:

if (m_sMySocket.Create())
{
// Continuă stabilirea legăturii
}
else
// Nu sa putut crea clasa. Trebuie de prelucrat eroarea existentă

În cazul cînd e nevoie ca socket-ul să lucreze ca server, adică e nevoie ca


ea să aştepte o eventuală conecţiune, atunci e nevoie de ai pasa cel puţin numărul
portului pe care socket-ul trebuie să-l “asculte”.
De exemplu:

if (m_sMySocket.Create(4000))
{
// Continuă mai departe
}
else
// Nu sa putut crea clasa. Trebuie de prelucrat eroarea existentă

Se poate include alţi parametric la folosirea metodei Create(), ca de


exemplu se poate indica tipul socket-ului folosit, evenimentele la care ar trebui să
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

răspundă şi adresa la care ar trebui să răspundă (în cazul cînd calculatorul are mai
multe cartele de reţea.

1.3.2 Crearea conexiunii

Odată ce a fost creat, socketul are nevoie de a fi conectat. E nevoie de 3


paşi pentru a stabili o conexiune. Două dintre ele au loc pe Server, ascultara
portului pentru conectare, iar a treilea pas se face de client odată cu apelarea.
Pentru client stabilirea legăturii înseamnă pur şi simplu chemarea metodei
Connect(). Alientul are nevoie de a-i pasa doi parametri metodei Connect():
numele calculatorului, adresa în reţea şi a portului aplicaţiei cu care se conectează.
Metoda Connect se poate folosi prin două metode:

if (m_sMySocket.Connect("numelecalc.com", 4000))
{
// Continuă mai departe
}
else
// Se prelucrează erarea comisă

O altă formă este:


if (m_sMySocket.Connect("178.1.25.82", 4000))
{
// Continuă mai departe
}
else
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

// Se prelucrează erarea comisă

Pentru programul server, sau a părţii ce scultă, aplicaţia trebuie să-i


comunice socket-ului să asculte apelările ce vin prin metoda Listen(). Metoda
Listen() ia un singur argument. Acest argument specifică numărul de apeluri ce pot
aştepta conexiunea în rîndul de aşteptare. Valoarea maximă a lui este 5. Apelarea
metodei Listen() se poate face în felul următor:

if (m_sMySocket.Listen())
{
// Continuă mai departe
}
else
// Se prelucrează eroarea apărută.

Cînd altă aplicaţie încearcă să stabilească o conexiune, evenimentul e


înregistrat şi aplicaţia e înştiinţată de apelare. Aplicaşia ce aşteptă trebuie să
accepte cererea chemînd metoda Accept(). Această metodă necesită de a
întrebuinţa o a doua variabilă de tipul CasyncSocket, care este cu o altă aplicaţie.
Odată ce socketul e stabilit în regimul de ascultare, el rămîne în regimul de
ascultare. Cînd cererea de conexiune e primită socket-ul ce ascultă crează alt
socket, care se uneşte cu altă aplicaţie. Al doilea Socket nu are nevoie de a chema
metoda Create() deoarece ea este chemată de metoda Accept(). Chemarea metodei
Accept() se face în modul următor:

if (m_sMySocket.Accept(m_sMySecondSocket))
{
// Continuă mai departe
}
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

else
// Se prelucrează eroarea apărută

Ca rezultat aplicaţia client se conecteaza cu al doilea socket a aplicaţiei


Server.

1.3.3 Transmiterea şi primirea mesajelor.

Deorece socketurile au fost elaborate să poată transmite orce fel de date, şi


nu are importanţă ce date sînt, funcţiile de transmitere şi primire aşteaptă să-I fie
pasate pointere a unui buffer de date care trebuie transmise. Pentru partea ce
primeşte, acest buffer înseamnă locul unde vor fi plasate datele. În cazul cînd se
transmite şi se primeşte simplu text e foarte simplu de folsit clasa Cstrings pentru
aceste bufere.
Pentru a transmite un mesaj prin conexiune,se foloseşte metoda Send().
Această metodă are nevoie de doi parametric, şi al treilea opţional. Primul
parametru este pointerul la buferul cu datele ce trebuie transmise. Cînd mesajul
este un obiect CString, se poate folosi operatorul LPCTSTR pentru a pasa o
variabilă CString ca bufer. Al doilea parametru este lungimea buferului. Dacă
apare vre-o eroare, metoda Send întoarce SOCKET_ERROR. Metoda Send() se
poate folosi în forma următoare:

CString strMyMessage;
int iLen;
int iAmtSent;
.
.
.
iLen = strMyMessage.GetLength();
iAmtSent = m_sMySocket.Send(LPCTSTR(strMyMessage), iLen);
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

if (iAmtSent == SOCKET_ERROR)
{
// Se prelucrează eroarea apărută
}
else
{
// Totul este în ordine
}

Cînd datele sînt pregătite, aplicaţia ce primeşte este înştiinţată. Aceasta


face ca aplicaţia să poată primi şi prelucra mesjul. Pentru a primi mesajul e folosită
metoda Receive(). Această metodă are aceiaşi parametri ca şi metoda Send() cu o
mică diferenţă. Primul parametru indică pointerul la buferul unde datele trebuie
înscrise. Al doilea parametru este marimea buferului. Aceasta înştiinţează aplicaţia
ce volum de date va sosi. Ca şi în cazul metodei Send() metoda Receive() poate
întoarce SOCKET_ERROR. Dacă mesajul este un text, el poate fi copiat direct
într-o variabilă string. Metoda Receive() se poate folosi în modul următor:

char *pBuf = new char[1025];


int iBufSize = 1024;
int iRcvd;
CString strRecvd;
iRcvd = m_sMySocket.Receive(pBuf, iBufSize);
if (iRcvd == SOCKET_ERROR)
{
// Se prelucrează eroarea apărută
}
else
{
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

pBuf[iRcvd] = NULL;
strRecvd = pBuf;
// Se prelucrează mesajul mai departe.
}

1.3.4 Întreruperea conexiunii

Odată ce aplicaţia nu mai are nevoie să comunice cu cealaltă aplicaţie ea


poate închide conecsiunea cu ajutorul metodei Close(). Metoda Close() nu are
nevoie de parametri şi se foloseşte în modul următor:

m_sMySocket.Close();

1.3.5 Evenimentele Socketelor

O cauză care ne impune să creăm o clasă descendentă din clasa


CAsyncSocket eate necesitatea da a capta şi prelucra mesaje cînd mesajul e primit,
conecţiunea e stabilită etc. Clasa CAsyncSocket are o serie de funcţii care sînt
apelate la unele din aceste evenimente. Aceste funcţii se declară cu acelas nume,
unica diferenţă este că ea acoperă funcţiile din clasa de bază. Toate aceste funcţii
sînt declarate ca membri protejaţi ai clasei CAsyncSocket şi probabil ar trebui
declaraţi protejaţi şi in clasele descendente.

S-ar putea să vă placă și