<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2015-05-26 20:31 GMT+03:00 Adrian Stanciu <span dir="ltr"><<a href="mailto:adrian.stanciu.pub@gmail.com" target="_blank">adrian.stanciu.pub@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">2015-05-26 20:26 GMT+03:00 Adrian Stanciu <<a href="mailto:adrian.stanciu.pub@gmail.com">adrian.stanciu.pub@gmail.com</a>>:<br>
> 2015-05-26 19:17 GMT+03:00 Georgiana Diana <<a href="mailto:geodiana93@gmail.com">geodiana93@gmail.com</a>>:<br>
>> Buna,<br>
>> Eu tot am niste nelamuriri legate de citirea asincrona / trimiterea cu send<br>
>> (inline):<br>
>><br>
><br>
> Bună, Georgiana!<br>
><br>
>> 2015-05-25 20:53 GMT+03:00 Adrian Stanciu via so <<a href="mailto:so@cursuri.cs.pub.ro">so@cursuri.cs.pub.ro</a>>:<br>
>>><br>
>>> 2015-05-25 20:49 GMT+03:00 Madalina Hristache via so<br>
>>> <<a href="mailto:so@cursuri.cs.pub.ro">so@cursuri.cs.pub.ro</a>>:<br>
>>> > Salut,<br>
>>><br>
>>> Bună, Mădălina!<br>
>>><br>
>>> ><br>
>>> > Am câteva nelămuriri și am nevoie de clarificarea lor ca să pot continua<br>
>>> > tema.<br>
>>> ><br>
>>> > 1. Când transmitem un fișier din directorul static, trimitem header-ul<br>
>>> > HTTP<br>
>>> > cu send (non-blocant, asincron), apoi fișierul cu sendfile. Fără nicio<br>
>>> > legătură cu libaio.h, da?<br>
>>><br>
>>> Da, așa este.<br>
>>><br>
>>> ><br>
>>> > 2. Când transmitem un fișier din directorul dynamic, îl citim de pe disc<br>
>>> > cu<br>
>>> > apeluri legate de libaio.h, apoi îl punem pe socket. Și cum îl trimitem?<br>
>>> > Cu<br>
>>> > send? Sendfile? La partea asta sunt în ceață.<br>
>>> ><br>
>>><br>
>>> Cu send().<br>
>><br>
>><br>
>> In exemplul din laborator [1], precum si in exemplul sugerat in tema [2]<br>
>> (xmailserver), am observat ca se face read pe un file descriptor, pentru a<br>
>> notifica serverul atunci cand operatia asincrona de citire s-a terminat.<br>
>><br>
>> 1) Este acest read blocant, sau nu ?<br>
><br>
> Acel read() pe eventfd este blocant, dar nu se va bloca dacă îl apelâm<br>
> atunci când primim o notificare de la kernel, prin intermediul epoll.<br>
><br>
>> 2) Care ar trebui sa fie workflow-ul server-ului in cazul trimiterii unui<br>
>> fisier dinamic ? Ma gandeam ca unul posibil este acesta, dar inca nu imi dau<br>
>> seama daca este corect:<br>
>><br>
>> initializare io_context (in main, inainte de logica serverului);<br>
><br>
> Este mai ușor dacă folosești un context IO per conexiune.<br></div></div></blockquote><div><br></div><div>Atunci cred ca ar trebui modificat enuntul, care spune: "Recomandăm folosirea unei variabile globale de tipul io_context_t și a unui descriptor eventfd pentru fiecare conexiune." In rest, mersi mult pentru raspuns !</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">
><br>
>> in server, primirea unui request de citire fisier dinamic;<br>
>> trimiterea catre client a unui raspuns: 200/404, in functie de caz, prin<br>
>> send-uri repetate (metoda comuna, atat pentru fisier static, cat si pentru<br>
>> dinamic);<br>
>> dupa trimiterea header-ului, in cazul unui fisier dinamic, serverul seteaza<br>
>> un eventfd si submite un request de read pentru contextul aio -- actiune<br>
>> neblocanta;<br>
>> serverul face read pe eventfd-ul anterior -- actiune blocanta ?;<br>
><br>
> Practic neblocantă dacă citirea se face la semnalizarea pe eventfd din<br>
> partea epoll.<br>
><br>
>> in urma notificarii de terminare a citirii din fisier a unui buffer in<br>
>> general mai mic decat dimensiunea fisierului, serverul face apeluri send<br>
>> repetate, pentru a trimite buffer-ul proaspat citit; -- in timpul acesta, se<br>
>> presupune ca serverul initiaza o noua cerere de citire asincrona, sau<br>
>> asteapta trimiterea buffer-ului curent ? ;<br>
><br>
> E mai ușor dacă nu faci aceste operații simultan; e mai eficient dar<br>
> ar trebui să tratezi în același timp mai multe tipuri de evenimente<br>
> (read din fișier, send pe socket), care ar fi starea conexiunii? iar<br>
> complexitatea implementării ar fi mai mare.<br>
><br>
>> serverul continua sa citeasca bucati de fisier si sa le trimita catre<br>
>> client.<br>
>><br>
>> 3) Este corect ca in functia de trimitere fisier, pentru cazul unui fisier<br>
>> dinamic, si care se tot apeleaza in bucla principala a server-ului (pentru<br>
>> ca epoll este setat pe out, cat timp trimit un fisier), sa verific si sa<br>
>> schimb starea conexiunilor (de ex, cat timp trimit fisierul, starea sa fie<br>
>> SENDING_DATA, apoi, cand citirea asincrona se termina, pur si simplu sa<br>
>> schimb starea in DATA_SENT si sa inchid conexiunea) ?<br>
><br>
> Poți să:<br>
> * activezi EPOLLIN pe eventfd pentru a aștepta finalizarea citirii<br>
> asincrone a unei bucăți din fișier<br>
> * planifici citirea asincronă a unei bucăți din fișier<br>
> * activezi EPOLLOUT pe socket<br>
<br>
</div></div>Nu am spus complet aici ... activarea EPOLLOUT pe socket se face când<br>
citirea asincronă a fost încheiată. Atunci avem date de trimis.<br>
<div class=""><div class="h5"><br>
> * când ești notificată de epoll că poți să trimiți pe socket, trimiți<br>
> bucata de fișier<br>
> * dacă nu s-a trimis întreaga bucată mai aștepți un nou eveniment de<br>
> EPOLLOUT pe socket din partea epoll și apoi trimiți ce ți-a mai rămas<br>
> și tot așa<br>
> * când ai terminat de trimis acea bucată, dezactivezi EPOLLOUT pe<br>
> socket (căci deocamdată nu mai ai ce trimite)<br>
> * o iei de la capât pentru a citi următoarea bucată din fișier<br>
> * când ai trimis întreg fișierul se poate închide conexiunea<br>
><br>
<br>
<br>
Adrian<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><font color="#0000ff"><b>Georgiana Diana Ciocirdel</b></font><div>Polytechnic University of Bucharest,</div><div>Computer Science</div></div></div>
</div></div>