Să se implementeze un server web care să folosească operații avansate de intrare/ieșire:
Pentru implementare se va folosi API-ul de operații I/O avansate specific sistemelui de operare Linux:
Serverul web va utiliza API-ul modern de multiplexare pentru a aștepta conexiuni din partea clienților: epoll (Linux). Pe conexiunile realizate se vor recepționa cereri din partea clienților și apoi se vor distribui răspunsurile către aceștia.
Clienții și serverul vor comunica folosind protocolul HTTP. Pentru parsarea cererilor HTTP din partea clienților recomandăm folosirea acestui parser HTTP, disponibil și în cadrul directorului de resurse ale temei. Va trebui să folosiți un callback pentru obținerea căii către resursa locală solicitată de client. Tot în directorul de resurse, găsiți un exemplu simplificat de folosire a parser-ului.
Serverul implementează o funcționalitate limitată a protocolului HTTP, aceea de a transmite fișiere clienților. Serverul va furniza fișiere din directorul AWS_DOCUMENT_ROOT
, definit în cadrul antetului temei. Fișiere se găsesc doar în subdirectoarele AWS_DOCUMENT_ROOT/static/
, respectiv AWS_DOCUMENT_ROOT/dynamic/
, iar request path-uri corespunzătoare vor fi, de exemplu, AWS_DOCUMENT_ROOT/static/test.dat
, respectiv AWS_DOCUMENT_ROOT/dynamic/test.dat
. Prelucrarea fișierelor va fi următoarea:
AWS_DOCUMENT_ROOT/static/
sunt fișiere statice care vor fi transmise clienților folosind API de zero-copying ( sendfile/ TransmitFile).AWS_DOCUMENT_ROOT/dynamic/
sunt fișiere pentru care se presupune că este necesară o fază de post-procesare din partea serverului. Aceste fișiere vor fi citite de pe disc folosind API asincron și apoi vor fi transmise către clienți. Transmiterea va folosi sockeți non-blocanți (Linux).După transmiterea unui fișier, conform protocolului HTTP, conexiunea este închisă.
\r\n\r\n
), urmat de conținutul efectiv (fișierul).Date
, Last-Modified
etc.Content-Length
trebuie să precizeze dimensiunea conținutului HTTP (datelor efective) la nivel de octeți.Connection
trebuie inițializată la close
.AWS_LISTEN_PORT
.AWS_DOCUMENT_ROOT
.Makefile
.README.md
.samples/
din directorul aferent fiecărui sistem de operare pentru exemple de utilizare a API-ului pe sockeți.GET /path/to/resource HTTP/1.0
). Exemplu de folosire:$ nc localhost 8888 GET / HTTP/1.0
echo -ne "GET / HTTP/1.0\r\n\r\n" | nc -q 2 localhost 8888
O_NONBLOCK
).<libaio.h>
.io_context_t
și a unui descriptor eventfd pentru fiecare conexiune.printf
, funcțiile de alocare de memorie malloc
, free
și funcțiile de lucru cu șiruri de caractere (strcat
, strdup
etc.)fopen
, fread
, fwrite
, fclose
nu trebuie folosite; în locul acestora folosiți open
, io_setup
, io_submit
, close
.send()
și recv()
. Nu este permisă folosirea funcțiilor read()
și write()
pentru lucrul cu sockeți. README
din cadrul arhivei.aws
(Linux).send
și recv
pentru operațiile cu sockeți eventfd
și epoll
io_*
(din libaio
) pe Linux va pierde punctajul pentru testele cu fișiere dinamice (testele 26-35)
Pentru întrebări sau nelămuriri legate de temă folosiți forumul temei.
ATENȚIE să nu postați imagini cu părți din soluția voastră pe forumul pus la dispoziție sau orice alt canal public de comunicație. Dacă veți face acest lucru, vă asumați răspunderea dacă veți primi copiat pe temă.