Servicii de comunicatie prin mesaje în retele Novell
Serviciile de comunicaþie prin mesaje permit programelor de aplicaþie:
a) sã emitã mesaje de pâna la 55 de octeþi în vederea difuzarii lor la mai multe destinaþii
b) sã stabileasca unul sau mai multe canale de mesaje cu o anumitã staþie de lucru legatã la acelaºi file server. Un astfel de canal oferã posibilitatea transmiterii de mesaje de pâna la 126 de octeþi.
Difuzarea de mesaje ºi comunicaþia prin canale consumã timp calculator la server. Pentru a avea o adevaratã comunicaþie de la egal la egal între staþiile de lucru, programele de aplicaþii pot sã foloseascã funcþiile IPX sau SPX sau NetBIOS. Aceste funcþii nu folosesc timp UC server ºi deci oferã performanþe mai bune ºi o flexibilitate crescutã. Pentru serviciul de difuzare a mesajelor, fiecare conexiune a unui file server are asociatã un buffer de 55 de octeþi pentru serviciul de comunicaþie prin canale, serverul menþinând pentru fiecare cone 13513w2215n xiune o coadã de mesaje (capacitatea maxima a cozii este de 6 mesaje). În mod normal, odatã cu conexiunea se trimite un mesaj spre difuzare cãtre o altã conexiune, acesta este depus în bufferul de mesaje difuzate sau în coada de mesaje primite ale conexiunii destinatare de unde este preluat de supervizor (shell) ºi afiºat pe linia cea mai de jos, a 25-a linie a ecranului.
Fiecare conexiune are un mod de tratare a mesajelor (un nr numai între 0 ºi 3, care poate fi modificat prin program), care precizeazã dacã bufferul destinat mesajelor difuzate este deschis sau nu ºi dacã supervizorul are sau nu voie sã preia automat mesajele difuzate.
Funcþiile de comunicare prin mesaje sunt folosite de programele utilitare SEND, CASTON ºi CASTOFF, care se folosesc pentru a emite mesaje în vederea difuzarii, sã permitã sau sã interzicã recepþionarea mesajelor difuzate. Mesajele transmise cu ajutorul acestor funcþii pot fi înregistrate într-un fiºier jurnal special, accesibil administratorului reþelei.
Fiºiere antet necesare:
#include <nit.h>
#include <niterror.h>
BroadcastToConsole
Trimite un mesaj care va fi afiºat la consola serverului implicit. Mesajele afiºate la consolã ºterg mesajele precedente.
Parametri:
char *message ºir de caractere conþinând mesajul de trimis. Lungimea maximã este de 60 de caractere inclusiv NULul terminãtor. Sunt permise numai caracterele imprimabile din setul ASCII.
Rezultat:
int SUCCESSFULL
MESSAGE_QUEUE_FULL
IO_FAILURE (lipsã spaþiu dinamic de lucru).
CheckPipeStatus
Determinã starea uneia sau a mai multor canale de mesaje.
Parametri:
WORD *connectionList tablou conþinând numerele de conexiune ale staþiilor la care este legat fiecare dintre canalele asupra cãrora sã face interogarea.
BYTE *resultList fiecare element din acest tablou va primi ca valoare un cod indicând starea canalului identificat de elementul corespunzator din connectionList. Sunt definite urmatoarele valori :
0x00 -- canal în stare de funcþionare
0xFE -- cealaltã conexiune nu a deschis canalul corespunzãtor
0xFF -- canalul nu a fost deschis sau numãrul conexiunii este eronat.
WORD connectionCount numãrul de canale (elemente în tablourile precedente).
Rezultat:
int SUCCESSFUL
CloseMessagePipe
Închide unul sau mai multe canale de mesaje.
Parametri:
WORD *connectionList tablou conþinând numerele de conexiune ale staþiilor la care este legat fiecare dintre canalele care trebuie închise
BYTE *resultList fiecare element din acest tablou va primi ca valoare un cod indicând starea canalului identificat de elementul corespunzãtor din connectionList. Sunt definite urmãtoarele valori :
0x00 -- canalul a fost închis cu succes
0xFD -- eroare, cealaltã conexiune nu mai este validã
0xFF -- eroare, canalul nu era deschis.
WORD connectionCount numãrul de canale (elemente în tablourile precedente).
Rezultat:
int SUCCESSFULL
MESSAGE_QUEUE_FULL
IO_FAILURE (lipsã spaþiu dinamic de lucru).
GetBroadcastMessage
Preia un mesaj transmis prin difuzare. Apelarea acestei funcþii are sens numai
dacã modul de tratare a mesajelor difuzate este 2 sau 3.
Parametri:
char *messageBuffer va recepþiona mesajul (cel mult 55 de caractere, inclusiv NUL-ul terminator). Dacã nici un mesaj nu este disponibil, atunci messageBuffer[0] va lua valoarea '\0' (lungimea minimã a unui mesaj este 1).
Rezultat:
int SUCCESSFULL
MESSAGE_QUEUE_FULL
IO_FAILURE (lipsã spaþiu dinamic de lucru).
GetBroadcastMode
Permite aflarea modului curent de tratare a mesajelor difuzate. Un mesaj din
partea serverului poate elimina din buffer un mesaj din partea unei staþii de lucru.
Rezultat:
BYTE 0 -- mesajele sunt admise atât din partea altor staþii de lucru cât ºi din partea serverului. Supervizorul staþiei preia automat ºi afiºeazã fiecare mesaj.
1 -- mesajele sunt admise numai din partea serverului. Supervizorul staþiei preia automat ºi afiseazã fiecare mesaj.
2 -- mesajele sunt admise numai din partea serverului. Este sarcina utilizatorului sã preia mesajele.
3 -- sunt admise mesaje atât din partea serverului cât ºi a altei staþii de lucru. Este sarcina utilizatorului sã preia mesajele.
GetPersonalMessage
Preia un mesaj din coada de mesaje asociatã staþiei de lucru.
Parametri:
char *messageBuffer primeºte ca valoare un ºir de caractere reprezentând cel mai vechi mesaj din coadã (cel mult 127 de caractere, inclusiv NUL-ul).
WORD *connectionNumber primeºte ca valoare numãrul conexiunii care a emis mesajul, sau 0 dacã nu existã nici un mesaj în coadã.
Rezultat:
int SUCCESSFUL
IO_FAILURE (lipsã spaþiu dinamic de lucru).
LogNetworkMessage
Depune un mesaj în fiºierul NET$LOG.MSG al serverului implicit. Intrarea în fiºier va avea urmãtorul format:
luna/zi/an ore:minute STN numãr_staþie: mesaj
Funcþia poate fi utilizatã de utilitare sau de programe de aplicaþie care au nevoie sã înregistreze informaþii, de exemplu cu scopul de a le folosi pentru contabilitate.
Parametri:
char *message ºir de caractere imprimabile conþinând mesajul de înregistrat (cel mult 80 de caractere, inclusiv NUL-ul).
Rezultat:
int SUCCESSFUL.
OpenMessagePipe
Creazã o jumatate de canal de comunicaþie între staþia de lucru ºi una sau mai multe conexiuni, cealaltã jumatate a canalului (canalelor) trebuie creatã de conexiunea (conexiunile) destinatarã cu ajutorul aceleiaºi funcþii.
Parametri:
WORD *connectionList un tablou conþinând numerele conexiunilor la care trebuie conectatã staþia de lucru. Pentru fiecare element din acest tablou se aflã un element corespunzator în tabloul resultList.
BYTE *resultList elementele acestui tablou primesc ca valoare un cod care indicã rezultatul încercãrii de a deschide o conexiune între staþii de lucru ºi conexiunea indicatã de elementul corespunzator din connectionList. Valorile acestui cod pot fi :
0x00 -- succes, conexiunea destinatarã crease deja jumatatea ei de canal,
0xFE -- canal incomplet, conexiunea destinatarã existã, dar nu a creat încã jumatatea ei de canal,
0xFF -- eºec, conexiunea destinatarã nu existã.
WORD connectionCount numãrul de intrãri în connectionList.
Rezultat:
int SUCCESSFUL
IO_FAILURE (lipsã spaþiu dinamic de lucru).
SendBroadcastMessage
Trimite un mesaj spre difuzare la un numãr de conexiuni de pe acelaºi server.
Parametri:
char *message mesaj de difuzat (cel mult 56 de caractere, inclusiv NUL).
WORD *connectionList tablou conþinând numerele conexiunilor cãtre care trebuie difuzat mesajul.
BYTE *resultList tablou ale cãrui elemente primesc ca valoare un cod indicând modul în care s-a desfãºurat difuzarea mesajului cãtre conexiunea corespunzatoare din connectionList. Valorile acestui cod pot fi :
0x00 -- succes, mesajul a fost depus în bufferul de mesaje difuzate al conexiunii destinatare
0xFC -- eºec, bufferul de mesaje difuzate al conexiunii destinatare este deja plin
0xFD -- numãrul conexiunii destinatare este eronat
0xFF -- eºec, conexiunea destinatarã nu existã sau modul ei de tratare a mesajelor difuzate nu permite acceptarea mesajului.
WORD connectionCount numãrul de intrãri în connectionList.
Rezultat:
int SUCCESSFUL
IO_FAILURE (lipsã spaþiu dinamic de lucru).
SendPersonalMessage
Trimite un mesaj cãtre una sau mai multe conexiuni cu care staþia de lucru a deschis canale de mesaje.
Parametri:
char *message mesaj de trimis (cel mult 127 de caractere, inclusiv NUL).
WORD *connectionList tablou conþinând numerele conexiunilor cãtre care trebuie trimis mesajul.
BYTE *resultList tablou ale cãrui elemente primesc ca valoare un cod indicând modul în care s-a desfãºurat trimiterea mesajului cãtre conexiunea corespunzãtoare din connectionList. Valorile acestui cod pot fi :
0x00 -- success, mesajul a fost depus în bufferul de mesaje difuzate al conexiunii destinatare
0xFC -- eºec, coada de mesaje a conexiunii destinatare este deja plinã
0xFE -- conexiunea destinatarã nu a deschis acest canal
0xFF -- eºec, conexiunea destinatarã nu existã sau staþia de lucru nu a deschis un canal de comunicaþie spre aceastã conexiune.
WORD connectionCount numãrul de intrãri în connectionList.
Rezultat:
int SUCCESSFUL
IO_FAILURE (lipsã spaþiu dinamic de lucru).
SetBroadcastMode
Stabileste modul în care sunt tratate mesajele difuzate destinate acestei staþii de lucru.
Parametri:
BYTE broadcastMode o valoare între 0 ºi 3 specificând modul de tratare a mesajelor difuzate. Modul implicit este zero. Pentru semnificaþia valorilor vezi funcþia GetBroadcastMode.
Servicii de sincronizare în reþele Novell
Serviciile de sincronizare oferã programelor de aplicaþie posibilitatea coordonãrii accesului la fiºierele din reþea ºi la alte resurse.
Semafoare
Sistemul Netware pune la dispozitia utilizatorilor posibilitatea de a defini ºi folosi semafoare. Acestea pot fi folosite pentru a implementa cele mai diferite protocoale de sincronizare. Fiecãrui semafor îi sunt asociate douã contoare : un contor de procese care au 'deschis' semaforul (care au acces la semafor), ºi un contor care este decrementat la fiecare apel WaitOnSemaphore ºi incrementat la SignalSemaphore (contorul tipic pentru semafoare).
Etapele lucrului cu un semafor:
1) deschiderea semaforului (Open)
2) exploatarea semaforului (Wait ºi Signal)
3) închiderea semaforului (Close).
int OpenSemaphore(char *semaphoreName, int initialValue, long *semaphoreHandle,
WORD *openCount)
semaphoreName - numele semaforului (max. 128 de caractere, inclusiv NUL)
initialValue - valoarea iniþialã a semaforului. Acest parametru nu se ia în considerare decât dacã semaforul nu existã ºi este creat. Sunt permise valori între 0 ºi 127.
*semaphoreHandle primeºte ca valoare un descriptor de semafor, care va fi utilizat în celelalte funcþii
*openCount primeºte numãrul de procese care au 'deschis' acest semafor.
Rezultat:
0x00 SUCCESSFUL
0xFE INVALID_SEMAPHORE_NAME_LENGTH
0xFF INVALID_SEMAPHORE_INITIAL_VALUE
int ExamineSemaphore(long semaphoreHandle, int *semaphoreValue,
WORD *openCount)
Examineazã un semafor deschis. Depune în semaphoreValue, respectiv openCount,
valoarea contorului de semafor, respectiv numãrul de procese care au deschis semaforul.
Rezultat: 0x00 SUCCESSFUL
0xFF INVALID_SEMAPHORE_HANDLE
int WaitOnSemaphore(long semaphoreHandle, WORD timeoutLimit)
Încearcã sã decrementeze contorul asociat unui semafor. Dacã dupã decrementare acesta este mai mare sau egal cu zero, atunci procesul care a apelat Wait continuã. În caz contrar, procesul este depus într-o coada de aºteptare asociatã semaforului. Coada avanseazã la fiecare apel Signal pentru acelaºi semafor. Dacã procesul petrece în coadã mai mult de timeoutLimit unitãþi de 1/18 sec, atunci el este scos din coadã ºi funcþia întoarce un cod de eroare.
Rezultat:
0x00 SUCCESSFUL
0xFE TIMEOUT_FAILURE
0xFF INVALID_SEMAPHORE_HANDLE
int SignalSemaphore(long semaphoreHandle)
Încrementeaza contorul asociat semaforului. Dacã în coada de aºteptare se afla vreun proces, primul proces din coadã este deblocat.
Rezultat:
0x00 SUCCESSFUL
0x01 SEMAPHORE_OVERFLOW (contorul a depaºit 127)
0xFF INVALID_SEMAPHORE_HANDLE
int CloseSemaphore(long semaphoreHandle)
Închide un semafor. Pentru ca programul sã recâºtige accesul la acel semafor, trebuie sã apeleze iarãºi OpenSemaphore. Dacã acest proces era ultimul care folosea semaforul, atunci semaforul este distrus.
Rezultat:
0x00 SUCCESSFUL
0xFF INVALID_SEMAPHORE_HANDLE
Probleme
1. Imaginaþi aplicaþii în care sã folosiþi cât mai multe din apelurile relative la comunicaþia ºi sincronizarea distribuitã în reþele Novell
2. Studiaþi programele filecomm.cpp, ipxcomm.cpp, pipecomm.cpp ºi imaginaþi programe de aplicaþii (readers-writers, cei 5 filozofi, producãtor-consumator, etc)
|