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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Procese</strong> <strong>Windows</strong>; <strong>comunicaţii</strong> <strong>prin</strong> <strong>pipe</strong> <strong>şi</strong> <strong>IPC</strong> - 30 -<br />

Se scriu si se citesc mesaje de aceeasi lungime (maxima).<br />

Actiunea <strong>prin</strong>cipala a serverului este dirijata de functia parinte care are doar un parametru,<br />

descriptorul mailslotului de pe server. Sursa serverului este data in fisierul<br />

msgparinte.cpp<br />

void parinte(HANDLE in) {<br />

Mesaj *pm;<br />

HANDLE out;<br />

long pid;<br />

char nume[100];<br />

for ( ; ; ) {<br />

pm = ReadMes(in);<br />

pid = pm->pid;<br />

pm = dir(pm->i, pm->s);<br />

s<strong>prin</strong>tf(nume, "\\\\.\\mailslot\\p2f%d", pid);<br />

out = CreateFile(nume, GENERIC_WRITE,<br />

FILE_SHARE_WRITE|FILE_SHARE_READ,<br />

NULL, OPEN_EXISTING, 0, NULL);<br />

WriteMes(out, pm);<br />

CloseHandle(out);<br />

}<br />

}<br />

In mod ciclic, serverul aplicatiei repeta:<br />

� Parintele asteapta (cea mai mare parte a timpului) sa citeasca un mesaj din mailslotul<br />

lui (cel ce contine cereri).<br />

� Preia din cerere PID-ul clientului.<br />

� Intocmeste lista de fisiere ceruta.<br />

� Creeaza un fisier de acces la mailslotul clientului.<br />

� Ii scrie acestuia mesajul de raspuns.<br />

� Inchide fisierul creeat.<br />

Actiunea <strong>prin</strong>cipala a clientului este dirijata de functia fiu, unde in si out sunt descriptorii<br />

celor doua mailsloturi cu care lucreaza, iar pid este PID-ul clientului. Sursa clientului este<br />

data in fisierul msgfiu.cpp<br />

void fiu(HANDLE in, HANDLE out, long pid) {<br />

Mesaj *pm, mesaj;<br />

char *pc,linie[MAXL];<br />

int i;<br />

for ( ; ; ) {<br />

<strong>prin</strong>tf("Dati: numar|sufix: ");<br />

pc = (char*)fgets(linie, MAXL, stdin);<br />

if (pc == NULL) break;<br />

linie[strlen(linie)-1] = '\0';<br />

pc = strstr(linie, "|");<br />

if (pc == NULL) continue;<br />

mesaj.pid = pid;<br />

mesaj.i = atoi(linie);<br />

strcpy(mesaj.s, pc+1);<br />

mesaj.lung = PLUS + strlen(mesaj.s) + 1;<br />

WriteMes(out, &mesaj);<br />

pm = ReadMes(in);<br />

pc = pm->s;<br />

<strong>prin</strong>tf("%d\n",pm->lung);<br />

for (i = PLUS; i < pm->lung; ) {<br />

<strong>prin</strong>tf("%d %s\n", i, pc);

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

Saved successfully!

Ooh no, something went wrong!