1. Procese Windows; comunicaţii prin pipe şi IPC 2
1. Procese Windows; comunicaţii prin pipe şi IPC 2
1. Procese Windows; comunicaţii prin pipe şi IPC 2
- TAGS
- procese
- pipe
- www.cs.ubbcluj.ro
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Procese</strong> <strong>Windows</strong>; <strong>comunicaţii</strong> <strong>prin</strong> <strong>pipe</strong> <strong>şi</strong> <strong>IPC</strong> - 29 -<br />
Dacă există deja un mesaj în coada de mesaje funcţia ReadFile se execută imediat copiind<br />
în bufer mesajul. Dacă coada de mesaje este goală, funcţia va aştepta până în mailslot vor fi<br />
atâţia octeţi câţi aşteaptă funcţia.<br />
Un client mailslot este un program care trimite mesaje către un server mailslot. dimensiunea<br />
mesajului este limitată la 64K octeţi atunci când clientul scrie către un anumit mailslot,<br />
respectiv la 400 octeţi atunci când clientul trimite un broadcast către toate serverele mailslot<br />
din domeniu.<br />
<strong>1.</strong>6.2. Exemplul 9: lista de fisiere cu nume de anumita forma; implementare<br />
mailslot<br />
In cele ce urmeaza, reluam exemplul 7 prezentat la mai sus. Aici vom prezenta doar fisierele<br />
ce sunt modificate fata de acest exemplu.<br />
Sursa dir.cpp este identica cu cea deja prezentată.<br />
Pentru comunicarea <strong>prin</strong> mailslot, folosim fisierul msgmesaj.h:<br />
#define MAXS 10000<br />
#define MAXL 1000<br />
typedef struct {<br />
int lung;<br />
long pid;<br />
int i;<br />
char s[MAXS];<br />
} Mesaj;<br />
#define PLUS (sizeof(int))<br />
S-a introdus in plus campul pid. In el este retinut PID-ul clientului solicitant. Spre deosebire<br />
de implementarea <strong>prin</strong> <strong>pipe</strong> cu nume, aici serverul aplicatiei, cel care livreaza liste cu nume<br />
de fisiere, poate servi mai multi clienti. Fiecare client solicitant isi pune in mesaj PID-ul,<br />
pentru ca serverul sa stie cui sa ii intoarca lista.<br />
Aceasta implementare are un mailslot pe serverul aplicatiei, in care fiecare client isi scrie<br />
cererile. Din cauza specificului mailslot, si pentru a folosi tot mailslot pentru raspunsuri,<br />
fiecare client isi creeaza un mailslot propriu (numele lui contine PID). Prin intermediul<br />
acestuia serverul aplicatiei ii scrie clientului raspunsul.<br />
Pentru implementarea schimbului de mesaje sunt folosite functiile ReadMes si WriteMes.<br />
Continutul acestora este prezentat in sursa msgReadWrite.cpp<br />
Mesaj *ReadMes(HANDLE canal) {<br />
static Mesaj mesaj;<br />
DWORD no;<br />
ReadFile(canal, (char*)&mesaj, sizeof(Mesaj), &no, NULL);<br />
return &mesaj;<br />
}<br />
void WriteMes(HANDLE canal, Mesaj *pm) {<br />
DWORD no;<br />
WriteFile(canal, (char*)pm, sizeof(Mesaj), &no, NULL);<br />
}