Table of Contents

Úloha č.1 - TCP Server

Situace

Na planetě Mars bylo vypuštěno několik průzkumných robotů. Roboti posílají informace ze senzorů a fotografie okolí na stacionární družici na oběžné dráze. Nastřádané informace jsou později družicí odeslány k Zemi.

Bohužel však nejsou roboti na povrchu planety sami. Na komunikační server na družici se neustále kdosi pokouší připojovat, prolámat ochrany a server kompromitovat. Nevíme, zda se jedná o konkurenci nebo o cizí formu života, v každém případě je třeba server chránit a striktně dodržovat komunikační protokol.

Implementujte server běžící na družici, který bude od robotů přijímat a ukládat informace.

Obecné schema komunikace

Komunikační protokol je postaven nad transportním protokolem TCP. Server naslouchá na portu, který je zvolen v intervalu 3000 až 3999 (včetně). Protokol je textově orientovaný a lze jej vyzkoušet např. pomocí příkazu telnet adresa_serveru 3999 (v případě portu 3999).

Server očekává, že se k němu budou připojovat jednotliví klienti (roboti). Server si po navázání spojení klientem vyžádá autorizaci a autentizaci robota pomocí hesla. Poté může server přijmout informace ze senzorů a načíst fotografie okolí (pokud ji robot pošle). Po odpojení klienta nebo při porušení pravidel protokolu (detekováno na straně serveru) je spojení ukončeno. Na server se může připojovat více robotů najednou a je třeba je obsloužit tak, aby komunikace s jedním robotem neblokovala komunikaci s jiným robotem.

       Klient                                             Server

                    ---------- connect ----------->
                                                    server si vyžádá zadání
                                                    uživatelského jména
                    <--------- zpráva 200 ---------
robot pošle svoje
uživatelské jméno
                    ---------- zpráva U ---------->
                                                    server si zapamatuje
                                                    zaslané uživatel. jméno
                                                    (v této fázi neprovádí
                                                    žádnou kontrolu
                                                    povolených znaků a délky
                                                    uživatelského jména)
                    <--------- zpráva 201 ---------
robot pošle svoje
heslo
                    ---------- zpráva P ---------->
                                                    server si zkontroluje
                                                    poslané uživatelské
                                                    jméno a heslo.
                                                    
                                                    Pokud kontrola selhala,
                                                    bude odeslána zpráva
                                                    500 a spojení bude ze
                                                    strany serveru ukončeno.
                    <--------- zpráva 500 ---------
                                                    close()
                                                    
                                 NEBO

                                                    Pokud prošla kontrola
                                                    bez chyby, bude odeslána
                                                    zpráva 202.
                    <--------- zpráva 202 ---------
Robot může nyní
poslat informace
ze senzorů a odeslat
fotografie okolí.
Lze podeslat libovolný
počet zpráv I a F.
                    ---------- zpráva I ---------->
                                                    Pokud nesedí syntaxe 
                                                    zprávy I, bude odeslána
                                                    zpráva 501 a spojení 
                                                    bude ukončeno.

                                                    Zpráva je uložena do
                                                    logu, zpátky bude
                                                    odeslána zpráva 202.
                    <--------- zpráva 202 ---------
další zpráva
                    ---------- zpráva I ----------> 
                                                    Pokud nesedí syntaxe 
                                                    zprávy I, bude odeslána
                                                    zpráva 501 a spojení 
                                                    bude ukončeno.

                                                    Zpráva je uložena do
                                                    logu, zpátky bude
                                                    odeslána zpráva 202.
                    <--------- zpráva 202 ---------
a také fotografie
                    ---------- zpráva F ----------> 
                                                    Pokud nesedí syntaxe 
                                                    zprávy F, bude odeslána
                                                    zpráva 501 a spojení 
                                                    bude ukončeno.

                                                    Zpráva F obsahuje
                                                    kontrolní součet,
                                                    ten je třeba
                                                    zkontrolovat. Pokud
                                                    součet nesedí, bude
                                                    odeslána zpráva 300,
                                                    spojení nebude
                                                    ukončeno, zpráva však
                                                    nebude uložena na disk.
                                                    
                                                    Jinak bude fotografie
                                                    uložena na disk a
                                                    server odešle zprávu
                                                    202.
                    <--------- zpráva 202 ---------
Robot pokračuje
v odesílání zpráv
I a F, nakonec
spojení uzavře.

close()
                                                    Server reaguje 
                                                    uzavřením spojení

                                                    close()

Spojení musí být ukončeno do 45 sekund, jinak bude ze strany serveru násilně ukončeno (zpráva 502).

Struktura posílaných zpráv

Zprávy poslané klientem

zprávavýznamsyntaxe
U uživatelské jméno robota řetězec znaků zakončený \r\n (tj. hexadecimálně 13h a 10h). Není kladeno žádné omezení na délku nebo obsah tohoto řetězce (nesmí pouze obsahovat \r\n, protože touto sekvencí je zpráva zakončena).
P heslo robota řetězec znaků zakončený \r\n (tj. hexadecimálně 13h a 10h). Není kladeno žádné omezení na délku nebo obsah tohoto řetězce (nesmí pouze obsahovat \r\n, protože touto sekvencí je zpráva zakončena). Povolená uživatelská jména a hesla jsou uvedena níže.
I informace ze senzorů INFO <mezera> <libovolný řetězec znaků> \r\n
F fotografie okolí FOTO <mezera> <délka fotografie> <mezera> <data> <kontrolní součet>

Poznámky ke zprávě I

Za klíčovým slovem INFO následuje mezera a poté libovolný řetězec znaků neobsahující \r\n. Tento řetězec nemá omezenou velikost. Zpráva je ukončena sekvencí \r\n.

Příklad zprávy I:

INFO Teplotní senzor č.3 se porouchal.\r\n

Poznámky ke zprávě F

Délka fotografie se udává dekadickým zápisem v počtu bytů posílaného obrázku (bez kontrolního součtu). Tolik bytů dat je třeba přijmout a uložit do souboru. Délka musí být kladná nenulová. Délka není shora omezena.

Data jsou binární povahy a obsahují fotografii okolí. Tuto fotografii je třeba uložit do souboru (v aktuálním adresáři) s názvem “fotoXXX.png”, kde XXX je libovolné celé číslo od 0 do 999. Po skončení přenosu fotografie nebo po ukončení spojení se musí soubor s fotografií buď vymazat (chybný kontrolní součet, nekompletní přenos) nebo přejmenovat (je-li to nutné) na požadované jméno souboru.

Na Barykovi fotografii neukládejte.

Kontrolní součet následuje bezprostředně za koncem posílané fotografie. Jedná se o 4 byty ve formátu Big Endian (nejdříve se posílá nejvýznamnější byte slova). Kontrolní součet spočítáte jako součet všech jednotlivých bytů fotografie.

Příklad zprávy F:

FOTO 2775 @xfv8aw**<%#cd^aa ...(celkem 2775 bytů binárních dat) (4 byty kontrolního součtu)

Příklad krátké zprávy F pro demonstraci výpočtu kontrolního součtu:

FOTO 8 ABCDEFGH\x00\x00\x02\x24

Kontrolní součet je 65+66+67+68+69+70+71+72=548 (hex 224), tj. v binárním zápise v kódování Big Endian: <00h> <00h> <02h> <24h>. V tomto příkladu je zápisem \xHH označen 1 byte s hexadecimální hodnotou HH.

Zprávy poslané serverem

zprávavýznamsyntaxe
200 požadavek na zadání uživatelského jména 200 <mezera> LOGIN \r\n
201 požadavek na zadání hesla 201 <mezera> PASSWORD \r\n
202 server je připraven přijmout zprávu 202 <mezera> OK \r\n
300 chybný kontrolní součet 300 <mezera> BAD CHECKSUM \r\n
500 neplatné uživatelské jméno nebo heslo 500 <mezera> LOGIN FAILED \r\n
501 chyba syntaxe zprávy I nebo F 501 <mezera> SYNTAX ERROR \r\n
502 timeout (45 sekund od zahájení spojení) 502 <mezera> TIMEOUT \r\n

Po odeslání zprávy 500,501 a 502 je vždy ze strany serveru uzavřeno spojení.

Po odeslání zprávy 300 se spojení neukončí, avšak fotografie není uložena do souboru.

Zpráva 501 se posílá ihned po detekování chybné syntaxe (např. místo I (INFO) nebo F (FOTO) přijde znak X). Pozor na telnet, zapsaná řádka je odeslána až po stisku klávesy ENTER.

Příklad komunikace

kurzíva = text zobrazený v terminálu při spuštění a po ukončení spojení
tučně = server (družice)
normálně = klient (robot)
Sekvence \r\n jsou zobrazeny jako konce řádků.

xsmitka@fray1:/home/zam/xsmitka>telnet baryk-ng.fit.cvut.cz 3999
Trying 147.32.232.173…
Connected to baryk.fit.cvut.cz.
Escape character is '^]'.

200 LOGIN
Robot Emil cislo 33
201 PASSWORD
1645
202 OK
INFO 2014-02-19 03:34 nefunkční čidlo tlaku
202 OK
INFO 2014-02-19 03:35 blíží se jiný robot
202 OK
INFO 2014-02-19 03:38 jiný robot atakován, získáno čidlo tlaku
202 OK
FOTO 3068 …..3068 bytu dat + 4 byty kontrolního součtu…..
202 OK
^]q

telnet> q
Connection closed.
xsmitka@fray1:/home/zam/xsmitka>

Komentář: Spojení se v telnetu ukončí Ctrl+] a potom q a ENTER.

Jiný příklad:

xsmitka@fray1:/home/zam/xsmitka>telnet baryk.fit.cvut.cz 3999
Trying 147.32.232.173…
Connected to baryk.fit.cvut.cz.
Escape character is '^]'.

200 LOGIN
Robot Karel
201 PASSWORD
1045
202 OK
INFO 2014-02-19 03:34 nefunkční čidlo tlaku
202 OK
INFOblablabla
501 SYNTAX ERROR
Connection closed by foreign host.
xsmitka@fray1:/home/zam/xsmitka>

Uživatelská jména a hesla

Jednotliví roboti se musí přihlásit svým jménem a heslem. Protože sonda nemůže znát všechny roboty (někteří mohou být vyrobeni později než sonda), bylo rozhodnuto, že přihlašovací jména a hesla budou mít následující tvar:

Uživatelské jméno: Robot <libovolný řetězec neobsahující sekvenci \r\n>
Heslo: <součet hodnot jednotlivých bytů uživatelského jména zapsaných v dekadické formě>

Příklad: Robot345 / 674

Požadavky

./robot <port>
kde <port> je číslo portu, na kterém server naslouchá.

Implementační poznámky

Testování

Testování klienta

Referenční server pro první úlohu běží na adrese baryk-ng.felk.cvut.cz na portu 3999. Funkčnost serveru lze ověřit zadáním příkazu:
telnet baryk-ng.felk.cvut.cz 3999

Testování serveru

Testování Vašeho serveru testovacím klientem není možné provádět přímo z učebny (neprojde NATem). Proto bylo na serveru Baryk vyrobeno rozhraní, přes které můžete uploadovat svůj zdrojový kód a Baryk jej:

  1. zaarchivuje
  2. přeloží
  3. spustí v roli serveru
  4. na požádání otestuje

Překlad bude proveden podle použitého jazyka takto:

C gcc -o robot source.c -lpthread
C++ g++ -o robot source.c -lpthread
Java javac source.java

Pokud není Váš počítač schován za NATem, lze v rámci sítě ČVUT využít i testování přes síť. Na webové stránce http://baryk-ng.felk.cvut.cz/cgi-bin/robottcp zadáte IP adresu a port, na kterém běží Vaše implementace serveru. Po odeslání této informace bude Váš server otestován naším klientem. Výsledek bude zobrazen.

K dispozici máte seznam nejčastějších chyb, které mohou při testování nastat, a jejich popis.

Způsob odevzdání

Za každý týden prodlení je penalizace -0,5 bodu (jako přelom týdne se počítá konec cvičení). Odevzdání je možné pouze do uvedeného deadline.

Odevzdat lze pouze takovou úlohu, která splňuje minimální požadavky (za 0 bodů):

Postup odevzdání:

  1. otestujte svoje řešení proti klientovi na serveru Baryk
  2. připravte si zdrojové texty k nahlédnutí
  3. připravte si internetový prohlížeč na server Baryk a připravte se na překlad zdrojového kódu
  4. spusťte terminál, nastavte adresář s Vaší úlohou jako aktuální a zadejte příkaz ls -l
  5. zavolejte cvičícího

Bodování

Za úlohu můžete dostat max. 14 bodů. Penalizace:

Literatura

Průzkumní roboti na Marsu
Motivační vystřihovánka