28.01.2013 Views

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

SHOW MORE
SHOW LESS

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 />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!