5. prosince 2016, Brno ´ Pˇripravil: David Prochazka
S´ıt’ova´ komunikace v C++ Programovac´ı jazyk C++
Protokoly
ˇ Obsah pˇredna´ sky 1
Protokoly
2
Typy aplikac´ı
3
CGI
4
Samostatna´ TCP aplikace
5
Vyˇssˇ ´ı urove nˇ ´
6
Shrnut´ı
Strana 2 / 28
Protokoly
Strana 3 / 28
UDP UDP protokol (User Datagram Protocol) je tzv. nespolehliv´y protokol ze sady protokolu˚ internetu. ´ s´ı datagramy mezi poˇc´ıtaˇci v s´ıti, ale UDP protokol pˇrenaˇ ´ sen´y paket neztrat´ı, narozd´ıl od TCP nezaruˇcuje, zda pˇrenaˇ ˇ ı poˇrad´ı paketu, ˇ nezmen´ y paket nedoruˇc´ı ˚ nebo zda nekter´ ´ v´ıcekrat. D´ıky tomu je UDP pro lehke´ a cˇ asoveˇ citlive´ uˇ ´ cely rychlejˇs´ı ˇ s´ı. a efektivnejˇ ´ UDP se pouˇz´ıva´ napˇr´ıklad pro DNS, streamovana´ media, pˇrenos hlasu nebo videa (VoIP) a online hry. ˇ Nekter e´ aplikace (jako tˇreba TFTP) mohou podle potˇreby ´ pˇridavat jednoduch´y mechanismus spolehlivosti do aplikaˇcn´ı vrstvy.
Protokoly
Strana 4 / 28
ˇ Hlavicka UDP ´ a´ jen ze 4 pol´ıcˇ ek, z nichˇz 2 jsou UDP hlaviˇcka se sklad ´ volitelna. ´ ´ Pol´ıcˇ ka zdrojoveho a c´ıloveho portu jsou 16bitova´ a identifikuj´ı odes´ılaj´ıc´ı a pˇrij´ımaj´ıc´ı proces. Protoˇze UDP je bezestavov´y a odesilatel nemus´ı ˇ ’, zdrojov´y port je voliteln´y. Pokud se vyˇzadovat odpoved ˇ b´yt nastaven na nulu. nepouˇzije, zdrojov´y port by mel ´ ´ Po cˇ ´ıslech portu˚ nasleduje povinna´ delka UDP paketu ´ ı hodnota je 8 bajtu. vˇcetneˇ dat, v bytech. Minimaln´ ˚ Zb´yvaj´ıc´ı pol´ıcˇ ko hlaviˇcky je 16bitov´y kontroln´ı souˇcet pokr´yvaj´ıc´ı hlaviˇcku i data. Tento souˇcet je take´ ´ eˇ ˇ r vˇzdy pouˇz´ıva. ´ vynechateln´y, ale v praxi se tem
Protokoly
Strana 5 / 28
TCP TCP protokol (Transmission Control Protocol) je jedn´ım ze ´ ´ eˇ zakladn´ ıch protokolu˚ sady protokolu˚ Internetu, konkretn pˇredstavuje transportn´ı vrstvu. ´ ı a doruˇcovan´ ´ ı ve Protokol garantuje spolehlive´ doruˇcovan´ ´ em ´ poˇrad´ı. spravn ˇ ruje, zda pˇrenesena´ data nebyla TCP protokol oveˇ ´ ım spoˇcte kontroln´ı poˇskozena sˇ umem t´ım, zˇ e pˇred odeslan´ ´ souˇcet, uloˇz´ı jej do odes´ılaneho paketu a pˇr´ıjemce ˇ r´ı, zˇ e se shoduj´ı. kontroln´ı souˇcet vypoˇcte znovu a oveˇ ´ ´ souˇcasneˇ beˇ ˇ z´ıc´ı TCP take´ rozliˇsuje data pro v´ıcenasobn e, aplikace (napˇr´ıklad webov´y server a emalov´y server) ˇ z´ıc´ı na stejnem ´ poˇc´ıtaˇci. beˇ ´ ıch protokolu˚ TCP podporuje mnoho na Internetu popularn´ a aplikac´ı, vˇcetneˇ WWW, emailu a SSH.
Protokoly
Strana 6 / 28
Princip funkce TCP Aplikace pos´ıla´ proud (stream) 8bitov´ych bajtu˚ TCP ˇ protokolu k doruˇcen´ı s´ıt´ı, TCP rozdeluje proud bajtu˚ do ˇ reneˇ velk´ych segmentu. pˇrimeˇ ˚ (Velikost segmentu˚ je urˇcena parametrem Maximum Transmission Unit linkove´ vrstvy ˇ ke ktere´ je poˇc´ıtaˇc pˇripojen.) TCP pak pˇreda´ takto s´ıte, vznikle´ pakety IP protokolu k pˇrepraveˇ internetem do TCP ˇ r´ı, zˇ e se modulu na druhe´ straneˇ TCP spojen´ı. TCP oveˇ ´ ˇ cˇ ´ıslo pakety neztratily t´ım, zˇ e kaˇzdemu paketu pˇridelil ˇ ren´ı poˇrad´ı. sekvence, ktere´ se take´ pouˇzije k oveˇ ˇ potvrzen´ı pro TCP modul na straneˇ pˇr´ıjemce pos´ıla´ zpet ˇ ˇ pakety ktere´ byly usp eˇ s n e pˇ r ijaty. Pokud by se odesilateli ´ ´ potvzen´ı nevratilo do rozumne´ doby (round-trip time, RTT), ˇ vyprˇsel by odesilateluv eˇ ˚ cˇ asovaˇc a (pravdepodobn ´ data by vyslal znovu. ztracena)
Protokoly
Strana 7 / 28
´ Schema TCP komunikace
listen()
Client
bind()
Server
socket()
socket() connect()
accept() send() recv() recv() send()
close()
close()
Protokoly
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
Strana 8 / 28
Typy aplikac´ı
ˇ Obsah pˇredna´ sky 1
Protokoly
2
Typy aplikac´ı
3
CGI
4
Samostatna´ TCP aplikace
5
Vyˇssˇ ´ı urove nˇ ´
6
Shrnut´ı
Strana 9 / 28
Typy aplikac´ı
Strana 10 / 28
Typy s´ıt’ovych ´ aplikac´ı CGI (Common Gateway Interface) Aplikace spolupracuje s webov´ym serverem. ´ Pokud prijde je zavolana, vytvoˇr´ı se jej´ı instance. ´ ı, ale nevhodne´ pro Jednoduche´ na programovan´ frekventovane´ sluˇzby.
ˇ z´ıc´ı aplikace na urcit ˇ em ´ portu Permanentneˇ beˇ ˇ pˇrij´ıma´ Instance aplikace obsad´ı urˇcit´y port a na nem poˇzadavky. Nevyuˇz´ıva´ webov´y server. ˇ s´ı, ale obvykle rychlejˇs´ı neˇz ekvivalent v CGI. Komplikovanejˇ ´ zaalokovane´ prostˇredky (pˇripojen´ı k Muˇ ˚ ze m´ıt neustale ´ naˇctena´ data v pameti, ˇ atp.) databazi,
CGI
Strana 11 / 28
ˇ Obsah pˇredna´ sky 1
Protokoly
2
Typy aplikac´ı
3
CGI
4
Samostatna´ TCP aplikace
5
Vyˇssˇ ´ı urove nˇ ´
6
Shrnut´ı
CGI
Strana 12 / 28
´ ı informac´ı o klientovi CGI: Z´ıskan´ 1 2
# include < iostream .h > # include < stdlib .h >
3 4 5
void main (){ char * lpszRemoteHost = getenv ( " REMOTE_HOST " );
6
cout << " Content - type : text / html " << endl << endl ; ... cout << lpszRemoteHost << endl ; ...
7 8 9 10 11
}
Data zas´ılana´ klientovi odeˇsleme na cout. Webov´y server (Apache) je odeˇsle.
CGI
Strana 13 / 28
CGI: Pˇrevzet´ı parametru˚ ˇ Metod je nekolik. Subjektivneˇ nejjednoduˇzsˇ ´ı je naˇc´ıst ˇ promennou QUERY STRING. Tu pak rozparsovat podle symbolu & ˇ ıc´ıho parametry. oddeluj´ 1 2
char * data = getenv ( " QUERY_STRING " ); string parametry = data ;
ˇ jako string obsahuje neco "jmeno=jana&vek=12&vaha=39"
Samostatna´ TCP aplikace
ˇ Obsah pˇredna´ sky 1
Protokoly
2
Typy aplikac´ı
3
CGI
4
Samostatna´ TCP aplikace
5
Vyˇssˇ ´ı urove nˇ ´
6
Shrnut´ı
Strana 14 / 28
Samostatna´ TCP aplikace
Strana 15 / 28
ˇ z´ıc´ı aplikace v C/C++ Permanentneˇ beˇ ´ ´ z´ı k pˇr´ıkladum Nasleduj´ ıc´ı slidy se vaˇ ˚ o s´ıt’ov´ych aplikac´ıch v ´ e´ specialn´ ´ ı knihovny, ale C/C++. Tento pˇr´ıstup nevyˇzaduje zˇ adn ´ ´ ˇ je vzhledem k ceˇckovske orientaci relativne komplikovan´y. ˇ ´ Pokud to typ projektu umoˇznuje je lepe pokusit se pouˇz´ıt ˇ nekterou z objektov´ych knihoven (napˇr. Qt).
Samostatna´ TCP aplikace
Strana 16 / 28
TCP klient: vytvoˇren´ı socketu ´ y poˇc´ıtaˇc hostent *host – vzdalen´ sockaddr in serverSock – socket (potrub´ı) 1 2 3 4
if (( host = gethostbyname ( argv [1])) == NULL ) { cerr << " Spatna adresa " << endl ; return 1; }
5 6 7 8 9 10 11
int mySocket ; // na kterem bude server naslouchat if (( mySocket = socket ( AF_INET , SOCK_STREAM , IPPROTO_TCP )) == -1) { cerr << " Nelze vytvorit soket " << endl ; return 2; }
Samostatna´ TCP aplikace
Strana 17 / 28
TCP klient: connect 1 2 3 4 5 6 7 8
// Zaplnime strukturu sockaddr_in // Rodina protokolu serverSock . sin_family = AF_INET ; // Cislo portu , ke kteremu se pripojime serverSock . sin_port = htons ( serverPort ); // Nastaveni IP adresy , ke ktere se pripojime memcpy (&( serverSock . sin_addr ) , host - > h_addr , host - > h_length );
9 10 11 12 13 14 15
// Pripojeni soketu if ( connect ( mySocket , ( sockaddr *)& serverSock , sizeof ( serverSock )) == -1) { cerr << " Nelze navazat spojeni " << endl ; return -1; }
Samostatna´ TCP aplikace
Strana 18 / 28
´ ı a pˇr´ıjem TCP klient: zas´ılan´ 1 2 3 4 5 6
if (( size = send ( mySocket , text . c_str () , text . size () + 1 , 0)) == -1){ cerr << " Problem s odeslanim dat " << endl ; return -1; } cout << " Odeslano " << size << endl ;
7 8 9 10 11 12 13 14 15
// Prijem dat text = " " ; while (( size = recv ( mySocket , buf , BUFSIZE , 0))!= -1){ cout << " Prijato " << size << endl ; text += buf ; } // Uzavru spojeni close ( mySocket );
Samostatna´ TCP aplikace
Strana 19 / 28
TCP server: start a pˇr´ıjem 1 2 3 4 5 6 7 8
sockName . sin_addr . s_addr = INADDR_ANY ; ... if ( bind ( mainSocket , ( sockaddr *)& sockName , sizeof ( sockName )) == -1){ cerr << " Problem s pojmenovanim soketu . " << endl ; return -1; } listen ( listenSocket , 5);
9 10 11 12 13 14 15 16
... sockaddr_in clientInfo ; addrlen = sizeof ( clientInfo ); // Vyberu z fronty pozadavek na spojeni . // " client " je novy soket spojujici klienta se serv . int client = accept ( mainSocket , ( sockaddr *)& clientInfo , & addrlen );
Samostatna´ TCP aplikace
Strana 20 / 28
UDP Princip komunikace pomoc´ı UDP je implementaˇcneˇ velice ´ sce. podobn´y. Viz vzorove´ pˇr´ıklady k pˇrednaˇ
ˇ ı urove Vysˇ s´ ´ nˇ
ˇ Obsah pˇredna´ sky 1
Protokoly
2
Typy aplikac´ı
3
CGI
4
Samostatna´ TCP aplikace
5
Vyˇssˇ ´ı urove nˇ ´
6
Shrnut´ı
Strana 21 / 28
ˇ ı urove Vysˇ s´ ´ nˇ
Strana 22 / 28
Pouˇzijte pˇripravene´ tˇr´ıdy: napˇr. v Qt ´ se s´ıt´ı, je nutne´ pˇridat Pokud chcete vyuˇz´ıvat tˇr´ıdy na praci ´ ´ do projektoveho souboru ˇradek 1
QT += network
´ Pokud nav´ıc pracujete pod OS X a nechcete, aby se Vam vytvoˇrila aplikace s GUI tak: 1
CONFIG -= app_bundle
Hlavn´ı funkce programu pak bude obsahovat instaci tˇr´ıdy QCoreApplication m´ısto QApplication 1 2 3
QCoreApplication a ( argc , argv ); ... return a . exec ();
ˇ ı urove Vysˇ s´ ´ nˇ
Strana 23 / 28
´ ´ Staˇzen´ı vzdalen eho souboru 1 2
QNe two r k A c c e s s M a n a g e r * manager ; = new Q N e t w o r k A c c e s s M a n a g e r ( this );
3 4 5
connect ( manager , SIGNAL ( finished ( QNetworkReply *)) , this , SLOT ( showFinished ( QNetworkReply *)));
6 7 8
m_manager - > get ( QNetworkRequest ( address )); ...
9 10 11 12 13 14 15 16 17
void Downloader :: showFinished ( QNetworkReply * reply ){ QFile file ( ui - > targetLineEdit - > text ()); file . open ( QIODevice :: WriteOnly ); file . write ( reply - > readAll ()); file . flush (); file . close (); delete reply ; }
ˇ ı urove Vysˇ s´ ´ nˇ
Strana 24 / 28
Pouˇzijte protokoly Existuje cela´ ˇrada standardizovan´ych protokolu˚ pro pˇrenos ´ data. dat. Nepos´ılejte proto surova“ ” Protokol REST: cˇ asto pouˇz´ıvan´y prokol pro internetove´ aplikace ´ y nejen z ruzn´ Protokol SOAP: protokol znam´ ˚ ych enteprise ´ u˚ system
ˇ ı urove Vysˇ s´ ´ nˇ
Strana 25 / 28
SOAP ´ Nastupce XML-RPC. Protokol pro komunikaci mezi webov´ymi sluˇzbami. ˇ ren na tvorbu sloˇzitejˇ ˇ s´ı komunikace. Zameˇ ˇ ale Lze pouˇz´ıt v´ıce prokolu˚ na aplikaˇcn´ı vrstve, ˇ s´ı je HTTP. nejrozˇs´ıˇrenejˇ ˇ zprav ´ je XML (dobˇre cˇ itelne, ´ huˇ Standard pro v´ymenu ˚ re ´ parsovatelne). 1 2 3 4 5 6 7
< soap : Envelope xmlns : soap = " http :// schemas . xmlsoap . org / < soap : Body > < ge tProdu ctDeta ils xmlns = " http :// app . com / ws " > < productID >827635 productID > getProductDetails > soap : Body > soap : Envelope >
ˇ ı urove Vysˇ s´ ´ nˇ
Strana 26 / 28
REST1 Spojen s protokolem HTTP. ´ ´ do URI. Poˇzadavek je kodov an ´ Existuj´ı 4 zakladn´ ı poˇzadavky: GET (vrat’), PUT ˇ (upravit/zamenit), POST (vyvtoˇrit) a DELETE (smazat). http://example.com/resources/ http://example.com/resources/142
ˇ se pouˇz´ıva´ ATOM/RSS nebo JSON. Pro datovou v´ymenu Jeho v´yhodou je: jednoduche´ snad rozˇsiˇritelne´ rozhran´ı ´ ı a implementace snadne´ zpracovan´
1
https://www.ibm.com/developerworks/webservices/library/ws-restful/
Shrnut´ı
ˇ Obsah pˇredna´ sky 1
Protokoly
2
Typy aplikac´ı
3
CGI
4
Samostatna´ TCP aplikace
5
Vyˇssˇ ´ı urove nˇ ´
6
Shrnut´ı
Strana 27 / 28
Shrnut´ı
Strana 28 / 28
Shrnut´ı CGI aplikace se implementuj´ı snadno, ale je nutne´ poˇc´ıtat s reˇzi´ı inicializace. Samostatne´ s´ıt’ove´ aplikace jsou komplexn´ı, ale mohou b´yt ˇ s´ı. v´yrazneˇ v´ykonnejˇ ˇ zne´ pˇr´ıkazy z C, ale je nutne´ V C++ je moˇzne´ pouˇz´ıvat beˇ poˇc´ıtat s komplexn´ımi strukturami. ˇ s´ı Qt2 , Boost3 a jine´ knihovny poskytuj´ı komfortnejˇ ´ ´ ˇ ˇ ´ ´ nastavbu, ktera reˇs´ı radu problemu˚ za vas.
2 3
http://doc.qt.io/qt-5/examples-network.html http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio.html