「🏗️」 wip: wtf is going on
This commit is contained in:
44
subjects/subject.hy.txt
Normal file
44
subjects/subject.hy.txt
Normal file
@ -0,0 +1,44 @@
|
||||
Առաջադրանքի անունը՝ mini_serv
|
||||
Ակնկալվող ֆայլեր՝ mini_serv.c
|
||||
Թույլատրված ֆունկցիաներ՝ write, close, select, socket, accept, listen, send, recv, bind, strstr, malloc, realloc, free, calloc, bzero, atoi, sprintf, strlen, exit, strcpy, strcat, memset
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Գրել ծրագիր, որը կսպասի մինչև հաճախորդը կմիանա 127.0.0.1 հասցեով միացման կետին(port) և թույլ կտա հաճախորդներին իրար հետ խոսել։
|
||||
|
||||
Այս ծրագիրը որպես առաջին արգումենտ վերցնում է միացման կետը։
|
||||
Եթե ոչ մի արգումենտ տրված չէ, այն պետք է stderr-ում գրի «Wrong number of arguments»՝ հաջորդված \n-ով և դուրս է գա 1 վիճակով։
|
||||
Եթե Համակարգային կանչերը սխալ է վերադարձնում մինչև ծրագիրը կսկսի կապեր ընդունել, այն պետք է stderr-ում գրի «Fatal error»՝ հաջորդված \n-ով և դուրս է գա 1 վիճակով։
|
||||
Եթե հիշողությունը չեք կարողանում տեղակայել, այն պետք է գրի stderr-ում գրի «Fatal error»՝ հաջորդված \n և դուրս գա 1 վիճակով։
|
||||
|
||||
Ձեր ծրագիրը պետք է արգելափակող չլինի, բայց հաճախորդը կարող է ծույլ լինել ու եթե ձեր հաղորդագրությունը չկարդա, նրան պետք ՉԷ կապից անջատել։
|
||||
|
||||
|
||||
Ձեր ծրագիրը չպիտի պարունակի #define preproc։
|
||||
Ձեր ծրագիրը պետք է հետևի միայն 127.0.0.1-ին։
|
||||
Ձեր ստացած fd-ին արդեն կարգավորված կլինի ստեղծել «recv» և «send»՝ արգելափակելու համար, եթե select-ը չի կանչվել նրանց կանչելուց առաջ, բայց այլ դեպքերում չի արգելափակի։
|
||||
|
||||
Երբ հաճախորդը միանում է սերվերին՝
|
||||
- Հաճախորդին կտրվի id․ առաջին հաճախորդը կստանա id 0 և յուրաքանչյուր նոր հաճախորդ կստանա վերջին հաճախորդի id + 1
|
||||
- %d-ն կփոխարինվի այս թվով
|
||||
- Սերվերին միացած բոլոր հաճախորդներին կուղարկվի հաղորդագրություն՝ «server: client %d just arrived\n»
|
||||
|
||||
Հաճախորդները պետք է կարողանան հաղորդագրություններ ուղարկել ձեր ծրագրին։
|
||||
- Հաղորդագրությունը միայն տպելի նիշերով է լինելու, ստուգելու կարիք չկա
|
||||
- Յուրաքանչյուր հաղորդագրությունը պետք է ավարտվի \n-ով։
|
||||
- Երբ սերվերը հաղորդագրություն ստանա, այն պետք է դա ուղարկի մյուս բոլոր հաճախորդներին՝ հաղորդագրությունից առաջ «client %d:»-ով։
|
||||
|
||||
Երբ հաճախորդը սերվերից անջատվում է,
|
||||
- սերվերին կապված բոլոր հաճախորդներին նամակ է ուղարկվում՝ «server: client %d just left\n»։
|
||||
|
||||
Հիշողության կամ fd արտահոսքեր չեն թույլատրվում։
|
||||
|
||||
Ձեզ օգնելու համար, ֆայլի main.c-ն կգտնեք սերվերի սկզբնական տողերով ու որոշ օգտակար ֆունկցիաներով։ (Ուշադի՛ր եղեք այս ֆայլում չթույլատրված ֆունկցիաներ գործածելիս կամ այնպիսի բաներ գրելիս, որոնք ձեր վերջնական ծրագրում չպիտի լինեն)
|
||||
To help you, you will find the file main.c with the beginning of a server and maybe some useful functions. (Beware this file use forbidden functions or write things that must not be there in your final program)
|
||||
|
||||
Զգուշացում։ Մեր փորձարկիչը ակնկալում է, որ հաղորդագրությունները ինչքան հնարավոր է արագ ուղարկեք։ Անիմաստ բուֆերներ պետք չէ անել։
|
||||
|
||||
Գնահատումը կարող է սովարականից մի քիչ երկար տևել
|
||||
|
||||
Հուշում՝ կարող եք nc-ն գործածել ձեր ծրագիրը փորձարկելու համար։
|
||||
Հուշում՝ պետք է nc-ն գործածեք ձեր ծրագիրը փորձարկելու համար։
|
||||
Հուշում՝ փորձարկելու համար կարող եք գործածել fcntl(fd, F_SETFL, O_NONBLOCK), բայց գործածե՛ք select և ԱՅԼԵՎՍ ԵՐԲԵՔ մի՛ ստուգեք (man 2 send)։
|
Reference in New Issue
Block a user