11. cvičení - Programování internetových aplikací 2
Cíle cvičení
- Programování klasických síťových aplikací – program ping
- Programování klasických síťových aplikací - jednoduchý chat (UDP verze).
Programování klasických síťových aplikací – program ping
ICMP zprávy slouží pro posílání a zjišťování různých servisních informací o stavu jednotlivých uzlů sítě. Také se dá použít pro zjištění existence nějakého uzlu sítě, cesty k tomuto uzlu atd.
Popis jednotlivých metod pro práci s ICMP lze nalézt v části Protokol ICMP.
Příklad jak napsat jednoduchý program ping je na serveru www.root.cz v seriálu o Socket api.
Úkol (za 2 body): Na Linux nebo Windows naprogramujte jednoduchou verzi programu ping, které se zadá doménové jméno serveru a počet dotazů na daný server.
Program vypíše velikost dotazu, jméno a ip adresu serveru, pořadové číslo požadavku, ttl (time to live) z ip hlavičky a čas od odeslání požadavku do odpovědi.
Pro zjištění aktuálního času můžete na Linux použít funkci gettimeofday a na Windows funkci GetSystemTime.
Výstup programu může vypadat takto:
$ ./ping seznam.cz 4 28 bytes from www.seznam.cz (77.75.76.3): icmp_req=1 ttl=249 time=21.3 ms 28 bytes from www.seznam.cz (77.75.76.3): icmp_req=2 ttl=249 time=21.0 ms 28 bytes from www.seznam.cz (77.75.76.3): icmp_req=3 ttl=249 time=17.5 ms 28 bytes from www.seznam.cz (77.75.76.3): icmp_req=4 ttl=249 time=35.1 ms
Programování klasických síťových aplikací - jednoduchý chat (UDP verze)
Práce s UDP sockety je možná jak ve Windows tak v Linux.
Od TCP se UDP liší tím, že před přenosem dat nedochází k vytvoření spojení a také, že při přenosu může dojít ke ztrátě dat nebo data mohou přijít v jiném pořadí než byly odeslány.
Popis jednotlivých metod pro práci s touto rodinou socketů lze nalézt zde v části Transportní vrstva (Protokoly TCP a UDP) a jak napsat UDP server a klienta je v seriálu o Socket API na Builder.cz.
Jednotlivé díly seriálu jsou zde:
Úkol (za 2 body): Napsat klient a server jednoduchého chatu (v kombinaci klient na Linux a server na Windows nebo obráceně klient na Windows a server na Linux).
Serveru se při startu zadá port, na kterém má poslouchat. V nekonečné smyčce přijímá UDP datagramy od klienta. V datagramu přijímá strukturu:
struct message { int index; // pořadové číslo zprávy char ip[16]; // ip adresa odesilatele zprávy v tečkovém tvaru char message[100]; // text zprávy };
a uloží si ji do paměti, vyplní hodnotu ip ip adresou odesilatele a odešle klientovi dosavadní obdržené zprávy ve strukturách message. Server si musí pamatovat jen posledních 100 zpráv.
Klient při startu obdrží IP adresu serveru a port serveru. V nekonečné smyčce čeká na vstup od uživatele. Tento vstup spolu s pořadovým číslem zprávy (počítaným od 0) vloží do struktury message (hodnotu ip nevyplňuje) a tuto odešle serveru. Od serveru přijme doposud serverem přijaté zprávy a vypíše je.
Zprávy od serveru končí zprávou message s hodnotou index který se rovná -1.
Strukturu message lze přijmout a odeslat stejně jako ICMP hlavičku (strukturu icmp hlavičky) v předchozím příkladu programu ping tj. přetypováním příchozího bufferu na strukturu message
.
Výstup klienta může vypadat takto:
$ ./tcp-klient 127.0.0.1 10000 zadejte zpravu: kratka zprava --------------------------------------- dosavadni konverzace: 192.168.1.2 - pořadí 0: predchozi zprava 127.0.0.1 - pořadí 0: kratka zprava --------------------------------------- zadejte zpravu: dalsi zprava --------------------------------------- dosavadni konverzace: 192.168.1.2 - pořadí 0: predchozi zprava 127.0.0.1 - pořadí 0: kratka zprava 127.0.0.1 - pořadí 1: dalsi zprava --------------------------------------- zadejte zprávu: