Buna, Eu tot am niste nelamuriri legate de citirea asincrona / trimiterea cu send (inline):
2015-05-25 20:53 GMT+03:00 Adrian Stanciu via so <[email protected]>: > 2015-05-25 20:49 GMT+03:00 Madalina Hristache via so <[email protected] > >: > > Salut, > > Bună, Mădălina! > > > > > Am câteva nelămuriri și am nevoie de clarificarea lor ca să pot continua > > tema. > > > > 1. Când transmitem un fișier din directorul static, trimitem header-ul > HTTP > > cu send (non-blocant, asincron), apoi fișierul cu sendfile. Fără nicio > > legătură cu libaio.h, da? > > Da, așa este. > > > > > 2. Când transmitem un fișier din directorul dynamic, îl citim de pe disc > cu > > apeluri legate de libaio.h, apoi îl punem pe socket. Și cum îl trimitem? > Cu > > send? Sendfile? La partea asta sunt în ceață. > > > > Cu send(). > In exemplul din laborator [1], precum si in exemplul sugerat in tema [2] (xmailserver), am observat ca se face read pe un file descriptor, pentru a notifica serverul atunci cand operatia asincrona de citire s-a terminat. 1) Este acest read blocant, sau nu ? 2) Care ar trebui sa fie workflow-ul server-ului in cazul trimiterii unui fisier dinamic ? Ma gandeam ca unul posibil este acesta, dar inca nu imi dau seama daca este corect: - initializare io_context (in main, inainte de logica serverului); - in server, primirea unui request de citire fisier dinamic; - trimiterea catre client a unui raspuns: 200/404, in functie de caz, prin send-uri repetate (metoda comuna, atat pentru fisier static, cat si pentru dinamic); - dupa trimiterea header-ului, in cazul unui fisier dinamic, serverul seteaza un eventfd si submite un request de read pentru contextul aio -- actiune neblocanta; - serverul face read pe eventfd-ul anterior -- *actiune blocanta* ?; - in urma notificarii de terminare a citirii din fisier a unui buffer *in general mai mic decat dimensiunea fisierului*, serverul face apeluri send repetate, pentru a trimite buffer-ul proaspat citit; -- *in timpul acesta, se presupune ca serverul initiaza o noua cerere de citire asincrona, sau asteapta trimiterea buffer-ului curent ? *; - serverul continua sa citeasca bucati de fisier si sa le trimita catre client. 3) Este corect ca in functia de trimitere fisier, pentru cazul unui fisier dinamic, si care se tot apeleaza in bucla principala a server-ului (pentru ca epoll este setat pe out, cat timp trimit un fisier), sa verific si sa schimb starea conexiunilor (de ex, cat timp trimit fisierul, starea sa fie SENDING_DATA, apoi, cand citirea asincrona se termina, pur si simplu sa schimb starea in DATA_SENT si sa inchid conexiunea) ? > > Adrian > _______________________________________________ > http://ocw.cs.pub.ro/courses/so/info/lista-discutii [1] http://ocw.cs.pub.ro/courses/so/laboratoare/laborator-11#integrarea_linux_aio_cu_eventfd [2] http://www.xmailserver.org/eventfd-aio-test.c -- *Georgiana Diana Ciocirdel* Polytechnic University of Bucharest, Computer Science
_______________________________________________ http://ocw.cs.pub.ro/courses/so/info/lista-discutii
