5. prosince 2016, Brno Připravil: David Procházka Sít ová komunikace v C++ Programovací jazyk C++
Protokoly Strana 2 / 28 Obsah přednášky 1 Protokoly 2 Typy aplikací 3 CGI 4 Samostatná TCP aplikace 5 Vyšší úroveň 6 Shrnutí
Protokoly Strana 3 / 28 UDP UDP protokol (User Datagram Protocol) je tzv. nespolehlivý protokol ze sady protokolů internetu. UDP protokol přenáší datagramy mezi počítači v síti, ale narozdíl od TCP nezaručuje, zda přenášený paket neztratí, nezmění pořadí paketů, nebo zda některý paket nedoručí vícekrát. Díky tomu je UDP pro lehké a časově citlivé účely rychlejší a efektivnější. UDP se používá například pro DNS, streamovaná média, přenos hlasu nebo videa (VoIP) a online hry. Některé aplikace (jako třeba TFTP) mohou podle potřeby přidávat jednoduchý mechanismus spolehlivosti do aplikační vrstvy.
Protokoly Strana 4 / 28 Hlavička UDP UDP hlavička se skládá jen ze 4 políček, z nichž 2 jsou volitelná. Políčka zdrojového a cílového portu jsou 16bitová a identifikují odesílající a přijímající proces. Protože UDP je bezestavový a odesilatel nemusí vyžadovat odpověd, zdrojový port je volitelný. Pokud se nepoužije, zdrojový port by měl být nastaven na nulu. Po číslech portů následuje povinná délka UDP paketu včetně dat, v bytech. Minimální hodnota je 8 bajtů. Zbývající políčko hlavičky je 16bitový kontrolní součet pokrývající hlavičku i data. Tento součet je také vynechatelný, ale v praxi se téměř vždy používá.
Protokoly Strana 5 / 28 TCP TCP protokol (Transmission Control Protocol) je jedním ze základních protokolů sady protokolů Internetu, konkrétně představuje transportní vrstvu. Protokol garantuje spolehlivé doručování a doručování ve správném pořadí. TCP protokol ověřuje, zda přenesená data nebyla poškozena šumem tím, že před odesláním spočte kontrolní součet, uloží jej do odesílaného paketu a příjemce kontrolní součet vypočte znovu a ověří, že se shodují. TCP také rozlišuje data pro vícenásobné, současně běžící aplikace (například webový server a emalový server) běžící na stejném počítači. TCP podporuje mnoho na Internetu populárních protokolů a aplikací, včetně WWW, emailu a SSH.
Protokoly Strana 6 / 28 Princip funkce TCP Aplikace posílá proud (stream) 8bitových bajtů TCP protokolu k doručení sítí, TCP rozděluje proud bajtů do přiměřeně velkých segmentů. (Velikost segmentů je určena parametrem Maximum Transmission Unit linkové vrstvy sítě, ke které je počítač připojen.) TCP pak předá takto vzniklé pakety IP protokolu k přepravě internetem do TCP modulu na druhé straně TCP spojení. TCP ověří, že se pakety neztratily tím, že každému paketu přidělil číslo sekvence, které se také použije k ověření pořadí. TCP modul na straně příjemce posílá zpět potvrzení pro pakety které byly úspěšně přijaty. Pokud by se odesilateli potvzení nevrátilo do rozumné doby (round-trip time, RTT), vypršel by odesilatelův časovač a (pravděpodobně ztracená) data by vyslal znovu.
Protokoly Strana 7 / 28 Schéma TCP komunikace socket() bind() Server Client listen() socket() accept() recv() send() connect() send() recv() close() close()
Protokoly Strana 8 / 28 Zdroj http://cs.wikipedia.org/wiki/tcp http://cs.wikipedia.org/wiki/udp http://en.wikipedia.org/wiki/tcp http://en.wikipedia.org/wiki/udp
Typy aplikací Strana 9 / 28 Obsah přednášky 1 Protokoly 2 Typy aplikací 3 CGI 4 Samostatná TCP aplikace 5 Vyšší úroveň 6 Shrnutí
Typy aplikací Strana 10 / 28 Typy sít ových aplikací CGI (Common Gateway Interface) Aplikace spolupracuje s webovým serverem. Pokud prijde je zavolána, vytvoří se její instance. Jednoduché na programování, ale nevhodné pro frekventované služby. Permanentně běžící aplikace na určitém portu Instance aplikace obsadí určitý port a na něm přijímá požadavky. Nevyužívá webový server. Komplikovanější, ale obvykle rychlejší než ekvivalent v CGI. Může mít neustále zaalokované prostředky (připojení k databázi, načtená data v paměti, atp.)
CGI Strana 11 / 28 Obsah přednášky 1 Protokoly 2 Typy aplikací 3 CGI 4 Samostatná TCP aplikace 5 Vyšší úroveň 6 Shrnutí
CGI Strana 12 / 28 CGI: Získání informací o klientovi 1 # include < iostream.h> 2 # include <stdlib.h> 3 4 void main (){ 5 char * lpszremotehost = getenv (" REMOTE_ HOST "); 6 7 cout << " Content - type : text / html " << endl << endl ; 8... 9 cout << lpszremotehost << endl ; 10... 11 } Data zasílaná klientovi odešleme na cout. Webový server (Apache) je odešle.
CGI Strana 13 / 28 CGI: Převzetí parametrů Metod je několik. Subjektivně nejjednodužší je načíst proměnnou QUERY STRING. Tu pak rozparsovat podle symbolu & oddělujícího parametry. 1 char * data = getenv (" QUERY_STRING "); 2 string parametry = data ; string obsahuje něco jako "jmeno=jana&vek=12&vaha=39"
Samostatná TCP aplikace Strana 14 / 28 Obsah přednášky 1 Protokoly 2 Typy aplikací 3 CGI 4 Samostatná TCP aplikace 5 Vyšší úroveň 6 Shrnutí
Samostatná TCP aplikace Strana 15 / 28 Permanentně běžící aplikace v C/C++ Následující slidy se váží k příkladům o sít ových aplikacích v C/C++. Tento přístup nevyžaduje žádné speciální knihovny, ale je vzhledem k céčkovské orientaci relativně komplikovaný. Pokud to typ projektu umožňuje je lépe pokusit se použít některou z objektových knihoven (např. Qt).
Samostatná TCP aplikace Strana 16 / 28 TCP klient: vytvoření socketu hostent *host vzdálený počítač sockaddr in serversock socket (potrubí) 1 if (( host = gethostbyname ( argv [ 1])) == NULL ) { 2 cerr << " Spatna adresa " << endl ; 3 return 1; 4 } 5 6 int mysocket ; // na kterem bude server naslouchat 7 if (( mysocket = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP )) 8 == -1) { 9 cerr << " Nelze vytvorit soket " << endl ; 10 return 2; 11 }
Samostatná TCP aplikace Strana 17 / 28 TCP klient: connect 1 // Zaplnime strukturu sockaddr_ in 2 // Rodina protokolu 3 serversock. sin_ family = AF_ INET ; 4 // Cislo portu, ke kteremu se pripojime 5 serversock. sin_ port = htons ( serverport ); 6 // Nastaveni IP adresy, ke ktere se pripojime 7 memcpy (&( serversock. sin_addr ), host -> h_addr, 8 host -> h_length ); 9 10 // Pripojeni soketu 11 if ( connect ( mysocket, ( sockaddr *)& serversock, 12 sizeof ( serversock )) == -1) { 13 cerr << " Nelze navazat spojeni " << endl ; 14 return -1; 15 }
Samostatná TCP aplikace Strana 18 / 28 TCP klient: zasílání a příjem 1 if (( size = send ( mysocket, text. c_str (), 2 text. size () + 1, 0)) == -1){ 3 cerr << " Problem s odeslanim dat " << endl ; 4 return -1; 5 } 6 cout << " Odeslano " << size << endl ; 7 8 // Prijem dat 9 text = ""; 10 while (( size = recv ( mysocket, buf, BUFSIZE, 0))!= -1){ 11 cout << " Prijato " << size << endl ; 12 text += buf ; 13 } 14 // Uzavru spojeni 15 close ( mysocket );
Samostatná TCP aplikace Strana 19 / 28 TCP server: start a příjem 1 sockname. sin_addr. s_addr = INADDR_ANY ; 2... 3 if ( bind ( mainsocket, ( sockaddr *)& sockname, 4 sizeof ( sockname )) == -1){ 5 cerr << " Problem s pojmenovanim soketu." << endl ; 6 return -1; 7 } 8 listen ( listensocket, 5); 9 10... 11 sockaddr_ in clientinfo ; 12 addrlen = sizeof ( clientinfo ); 13 // Vyberu z fronty pozadavek na spojeni. 14 // " client " je novy soket spojujici klienta se serv. 15 int client = accept ( mainsocket, 16 ( sockaddr *)& clientinfo, & addrlen );
Samostatná TCP aplikace Strana 20 / 28 UDP Princip komunikace pomocí UDP je implementačně velice podobný. Viz vzorové příklady k přednášce.
Vyšší úroveň Strana 21 / 28 Obsah přednášky 1 Protokoly 2 Typy aplikací 3 CGI 4 Samostatná TCP aplikace 5 Vyšší úroveň 6 Shrnutí
Vyšší úroveň Strana 22 / 28 Použijte připravené třídy: např. v Qt Pokud chcete využívat třídy na práci se sítí, je nutné přidat do projektového souboru řádek 1 QT += network Pokud navíc pracujete pod OS X a nechcete, aby se Vám vytvořila aplikace s GUI tak: 1 CONFIG -= app_ bundle Hlavní funkce programu pak bude obsahovat instaci třídy QCoreApplication místo QApplication 1 QCoreApplication a( argc, argv ); 2... 3 return a. exec ();
Vyšší úroveň Strana 23 / 28 Stažení vzdáleného souboru 1 QNetworkAccessManager * manager ; 2 = new QNetworkAccessManager ( this ); 3 4 connect ( manager, SIGNAL ( finished ( QNetworkReply *)), 5 this, SLOT ( showfinished ( QNetworkReply *))); 6 7 m_manager -> get ( QNetworkRequest ( address )); 8... 9 10 void Downloader :: showfinished ( QNetworkReply * reply ){ 11 QFile file (ui -> targetlineedit -> text ()); 12 file. open ( QIODevice :: WriteOnly ); 13 file. write ( reply -> readall ()); 14 file. flush (); 15 file. close (); 16 delete reply ; 17 }
Vyšší úroveň Strana 24 / 28 Použijte protokoly Existuje celá řada standardizovaných protokolů pro přenos dat. Neposílejte proto surová data. Protokol REST: často používaný prokol pro internetové aplikace Protokol SOAP: protokol známý nejen z různých enteprise systémů
Vyšší úroveň Strana 25 / 28 SOAP Nástupce XML-RPC. Protokol pro komunikaci mezi webovými službami. Zaměřen na tvorbu složitější komunikace. Lze použít více prokolů na aplikační vrstvě, ale nejrozšířenější je HTTP. Standard pro výměnu zpráv je XML (dobře čitelné, hůře parsovatelné). 1 <soap : Envelope xmlns : soap =" http :// schemas. xmlsoap. org / 2 <soap :Body > 3 < getproductdetails xmlns =" http :// app. com /ws"> 4 < productid >827635 </ productid > 5 </ getproductdetails > 6 </ soap :Body > 7 </ soap : Envelope >
Vyšší úroveň Strana 26 / 28 REST 1 Spojen s protokolem HTTP. Požadavek je kódován do URI. Existují 4 základní požadavky: GET (vrat ), PUT (upravit/zaměnit), POST (vyvtořit) a DELETE (smazat). http://example.com/resources/ http://example.com/resources/142 Pro datovou výměnu se používá ATOM/RSS nebo JSON. Jeho výhodou je: jednoduché snad rozšiřitelné rozhraní snadné zpracování a implementace 1 https://www.ibm.com/developerworks/webservices/library/ws-restful/
Shrnutí Strana 27 / 28 Obsah přednášky 1 Protokoly 2 Typy aplikací 3 CGI 4 Samostatná TCP aplikace 5 Vyšší úroveň 6 Shrnutí
Shrnutí Strana 28 / 28 Shrnutí CGI aplikace se implementují snadno, ale je nutné počítat s režií inicializace. Samostatné sít ové aplikace jsou komplexní, ale mohou být výrazně výkonnější. V C++ je možné používat běžné příkazy z C, ale je nutné počítat s komplexními strukturami. Qt 2, Boost 3 a jiné knihovny poskytují komfortnější nástavbu, která řeší řadu problémů za vás. 2 http://doc.qt.io/qt-5/examples-network.html 3 http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio.html