44 lines
4.7 KiB
Plaintext
44 lines
4.7 KiB
Plaintext
Առաջադրանքի անունը՝ 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)։ |