11. cvičení - Programování internetových aplikací 2

Cíle cvičení

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: