Gyorstalpaló hálózatprogramozás C nyelven UNIX. környezetben

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "Gyorstalpaló hálózatprogramozás C nyelven UNIX. környezetben"

Átírás

1 Gyorstalpaló hálózatprogramozás C nyelven UNIX környezetben Hajba Gábor László február 20.

2 Tartalomjegyzék 1. A legfontosabb parancs 4 2. TCP alapú kliens m ködése 4 3. Kliens socket létrehozása 5 4. Kapcsolódás a szerverhez 6 5. TCP alapú szerver m ködése 9 6. Szerver socket porthoz kötése Szerver socket felkészítése kliens fogadására Kapcsolat felvétele a klienssel Példa a szerver kapcsolatra kész állapotra hozására Kommunikáció Kapcsolat lezárása Kapcsolat felépítése a kliens szemszögéb l Kapcsolat felépítése a szerver szemszögéb l Kapcsolat bontása az aktív oldalon Kapcsolat bontása a passzív oldalon Egy korszer kliens-szerver megoldás A legegyszer bb megoldás Kliensek párhuzamos kiszolgálása gyermek folyamatok segítségével Folyamatok közötti kommunikáció pipe-ok segítségével 22 1

3 20.Kliensek kiszolgálása szálak segítségével Signalok Események, amelyek signalt válthatnak ki A session fogalma Daemon megvalósítása Szolgáltatás nyújtása inetd segítségével 23 2

4 El szó Ez ahogy a címe is jelzi egy gyorstalpaló és összefoglaló C nyelven történ hálózatprogramozáshoz. Így feltételez egy meglév programozási hátteret. Nem tér ki a téma egészére, és nem fed le minden említett témát teljes egészében. Ellenben arra éppen elég, hogy ne okozzon nagy nehézséget a Számítógéplapbor 2. elnevezés tantárgy sikeres elvégzése (a program megvédésével együtt). Írhatnék még egy általános bevezet t is, de szeritnem azt már mindenki átlapozza, ezért ismertnek tételezem fel a hálózati kommunikáció alapjait. A két lehetséges kommunikációs csatorna közül a TCP-vel foglalkozunk. A legtöbb helyen vázlatpontokat írok fel, ez is b ven elég a megértéshez, illetve a lényeg is könnyebben olvasható mint folyószövegben. 3

5 1. A legfontosabb parancs A programok fordítása a legfontosabb lépés a programozásban, így a legfontosabb parancs az, amelyikkel rá tudjuk venni a fordítót, hogy forrásfájljainkból bájtkódot generáljon, és futtathassuk alkalmazásunk. Ha megvan a kódunk, a következ paranccsal fordíthatjuk le: gcc -o programneve forrás1.c forrás2.c... Ha C++ nyelven írjuk a programot: g++ -o programneve forrás1.cpp forrás2.cpp... Amennyiben a program már tartalmaz hálózat kezelést, úgy szükséges még némi kiegészítés a fordításban: gcc -o programneve forrás1.c forrás2.c... -lnsl -lsocket -lresolv g++ -o programneve forrás1.cpp forrás2.cpp... -lnsl -lsocket -lresolv Ezek után a./programneve parancs kiadása után el is indul a program ha mindent jól csináltunk. Amennyiben mégsem, úgy hibajelzéssel tér vissza a fordító, melyet ki kell javítanunk. Nem kell meglep dni, ha más fordítón lefordul a program, míg a célrendszeren nem: el fordulnak eltérések a rendszer kongurációjából adódóan (f leg az URAL2-n). 2. TCP alapú kliens m ködése A program TCP-re épül szolgáltatást próbál elérni. A végrehajtás lépései: 1. socket létrehozása, 2. porthoz kötés, 4

6 3. kapcsolódás, 4. kommunikáció a szerverrel, 5. kapcsolat bezárása. A fent említett lépések közül a porthoz kötéssel nem foglalkozunk, annak a kliensnél nincs sok szerepe. 3. Kliens socket létrehozása Független attól, hova akarunk csatlakozni. Nem kell tudnunk a szerverprocessz címét. Vigyázni kell, hogy a megadott tartomány és protokoll helyes legyen. Létrehozásához a socket függvényt használjuk. A socket metódus: #include <sys / types. h> #include <sys / s o c ket. h> int s o c ket ( int domain, int type, int p r o t o c o l ) ; A függvény visszatérsi értéke egy socket leíró, hiba esetén 1. A domain paraméter értéke a következ lehet: AF_UNIX ha helyi hálózatra kívánunk csatlakozni, AF_INET ha az internetre kívánunk csatlakozni. A type paraméter értéke a következ k egyike lehet: SOCK_STREAM TCP kapcsolat létrehozásához, SOCK_DGRAM UDP kapcsolat létrehozásához, 5

7 SOCK_RAW_IP bele lehet nyúlni az üzenet fejrészébe át lehet írni az IP címet, csak root jogokkal futtatható (ezt nem használjuk). A protocol paraméter meghatározza a protokolt, ha 0-t adunk meg értékeként, akkor az alapértelmezett protokollt fogja használni (a type paraméterben megadott kapcsolat típushoz igazodva). 4. Kapcsolódás a szerverhez A connect metódussal történik. TCP-nél kötelez a használata, UDP-nél nem. A connect metódus: #include <sys / types. h> #include <sys / s o c ket. h> int connect ( int sd, const struct sockaddr addr, int addrlen ) ; A függvény visszatérési értéke 0 siker esetén, 1, ha valamilyen hiba lépett fel. Az sd paraméterben kell átadni a socket függvény által visszaadott socket leírót. Az addr mutatóban kell megadni a szerver processz címét (IP-cím + port) tároló struktúra hivatkozását. Err l kés bb olvashatunk b vebben. Az addrlen paraméter pedig a szerver processz címét tároló struktúra mérete. A connect metódus (sikeres) visszatérésével felépül a kapcsolat. A szerver processz címét egy sockaddr típusú struktúrába kell elhelyezni: struct in_addr{ u_long s_addr ; } ; struct sockaddr_in { 6

8 u_short sin_family ; u_short sin_port ; struct in_addr sin_addr ; char sin_zero [ 8 ] ; // nem h a s z n á l t } ; A sin_family a socket tartománya (esetünkben AF_INET). A sin_port a szolgáltatás portja. A sin_addr a szerver processz IP címét tárolja struktúra, ennek a s_addr részébe kell az IP-t elhelyezni. Felmerül a kérdés: honnan tudjuk az IP-t? Van, amikor alapból így hívjuk meg a programot, mert ismert a szerver processz IP címe, másik lehet ség pedig, hogy a neve alapján lekérjük az IP címet egy DNS szervert l. Ebben nyújt segítséget a gethostbyname metódus. #include <netdb. h> struct h o s t e n t gethostbyname ( const char hostname ) ; A hostname paraméter a szerver processz címét jelenti, pl. ural2.bme.hu. A függvény egy hostent struktúrával tér vissza siker esetén, egyébként 0-t ad vissza. struct hostent { // host neve char h_name ; // 0 v a l l e z á r t l i s t a a host t ö b b i n e v é r l char h_aliases ; // a cím t í p u s a ( esetünkben AF_INET) int h_addrtype ; // a cím hossza b á j t b a n 7

9 int h_length ; // 0 v a l l e z á r t l i s t a az IP címekr l char h_addr_list ; //a l i s t a e l s eleme a k o m p a t i b i l i t á s miatt #d e f i n e h_addr h_addr_list [ 0 ] } ; Az IP címek listájának els elemét (h_addrlist[0]) bemásoljuk a struktúra sin_addr tagjába. A htons paranccsal a hálózati bájtsorrendet módsíthatjuk, ha esetleg rossz formában volna (azaz mindenképp használjuk). Kommunikációt a read és write metódusokkal valósítjuk meg. A kapcsolat végén a socketet a close függvénnyel zárhatjuk le; ha stream-eket használunk, akkor pedig az fclose metódust kell meghívni. 1 Példa kapcsolat felépítésére: #include <sys / types. h> #include <sys / s o c ket. h> #include <n e t i n e t / in. h> // htons hoz s z u k s e g e s #include <netdb. h> int s o c ket ; struct hostent he ; struct sockaddr_in their_addr ; int k a p c s o l a t L e t e s i t e s e ( void ) 1 Nálam a stream-ek használata nem m ködött az URAL2-n. 8

10 { i f ( ( he = gethostbyname ( " u r a l 2. bme. hu" ) == NULL) { // megkapja a h o s t i n f o r m a c i o t e x i t ( 1 ) ; } i f ( ( s o c k e t = s o c k et (AF_INET, SOCK_STREAM, 0 ) ) == 1) { e x i t ( 1 ) ; } their_addr. sin_family = AF_INET; // host b a j t sorrend their_addr. sin_port = htons ( ) ; // a htons parametere a port their_addr. sin_addr = (( struct in_addr ) he >h_addr ) ; // k i n u l l a z z a a s t r u k t u r a t o b b i r e s z e t memset(&( their_addr. sin_zero ), ' \0 ', 8 ) ; i f ( connect ( socket, ( struct sockaddr )&their_addr, s i z e o f ( struct sockaddr ) ) == 1) { // k a p c s o l o d a s e x i t ( 1 ) ; } return 0 ; } 5. TCP alapú szerver m ködése Egy szerver is hasonló m veleteket végez el, mint a kliens: 1. Socket létrehozása a socket függvénnyel (azonosan m ködik, mint a kliensnél), 9

11 2. socket hozzákötése egy helyi porthoz a bind függvény segítségével ezen a porton keresztül tud csatlakozni a kliensünk, 3. socket felkészítése a kliensek fogadására a listen függvény segítségével, 4. a klienst l érkez kapcsolatkérés elfogadása az accept függvénnyel, 5. kommunikáció a read és a write függvényekkel, 6. kapcsolat lezárása a close vagy shutdown függvények valamelyikével. Most nézzük meg egyesével a lépéseket. 6. Szerver socket porthoz kötése #include <sys / types. h> #include <sys / s o c ket. h> int bind ( int sd, const struct sockaddr addr, int addrlen ) ; A függvény visszatérési értéke 0, ha minden rendben van, hiba esetén pedig 1. Az sd paraméter egy socket leíró, melyet a socket metódussal hoztunk létre. Az addr paraméter egy pontos cím, ahova kötjük a socketet (lásd a sockaddr struktúra korábbi leírását). Az addrlen paraméter a struktúra méretét (hosszát) tárolja. Ebben az esetben nincs értelme a 0 portot megadni, hisz akkor mi magunk sem tudjuk, melyik porton gyel a szerverünk. Talán akkor volna esély a használatára, mikor mi magunk nem tudjuk, melyik port lehet szabad (például sok hálózati alkalmazást egyszerre futtató gépünk van), és a kliens is broadcast kéréssel keresi meg a szervert. A laborfeladatban ez nem szükséges (ha valaki olyan forgatja ezt a jegyzetet, aki ilyesmit ír, akkor biztos jobban ért hozzá, mint ahogy itt leírom a dolgokat). 10

12 A számítógép összes IP címét az INADDR_ANY paraméter jelenti, ezeket is sorrendbe kell fordítani a htons paraméter használatával. (Tehát nem korlátozzuk be a klienst, hogy épp melyik IP címet kell feltárcsáznia, hogy elérje szerverszolgáltatásunk.) Ha egy socket már hozzá van kötve egy porthoz, akkor a getsockname függvénnyel kérdezhetjük le (ami azt takarja, hogy megadunk a függvénynek paraméterként egy sockaddr struktúrát és egy socketet, pedig visszaadja a struktúrában a megadott socket adatait). 7. Szerver socket felkészítése kliens fogadására Ezt a részt nevezhetjük listening nek az alkalmazott módszer után. A listen metódust csak a socket porthoz kötése után lehet meghívni ez eléggé nyilvánvaló; illetve csak kapcsolat orientált kapcsolatnál m ködik (tehát nekünk pont megfelel, hisz mi TCP kapcsolatot alkalmazunk). #include <sys / s o c ket. h> int l i s t e n ( int sd, int qlen ) ; A függvény visszatérési értéke 0, ha minden rendben, ellenkez esetben 1. Az sd paraméter a socket leírója. A qlen paraméter a várósor hosszát reprezentálja. A várósor azt jelenti, mennyi klienst engedünk egyszerre várakozni, míg felépül a kapcsolat. Ha túl nagy ez a szám, sok kliens várakozhat; ha pedig kicsi ez a szám, akkor csak kevés kliens fér be, a többieknek pedig nem m köd nek látszódik a szolgáltatás. 8. Kapcsolat felvétele a klienssel A kapcsolatot az accept függvény meghívásával (pontosabban visszatérésével) építhetjük fel szerverünk és egy kliens között. 11

13 Ezt a függvényt csak a listen függvény kiadása után hívhatjuk meg (természetesen ez az általunk használt kapcsolatorientált esetben szükséges). A függvény addig várakozik (ez által blokkolja a program továbbfutását), míg egy kliens nem kezdeményez kapcsolódást. Ekkor a kapcsolat felépítésével egy új socket jön létre (visszatérési érték). Ebb l következik, hogy az eredeti (szerver socket) megmarad, így az accept metódus kívánalmainknak megfelel számban meghívható; másik következménye pedig, hogy több kapcsolat lehet egyszerre, ezt pedig kezelni kell erre több módszer van, melyeket a kés bbiekben ismertetek. #include <sys / s o c ket. h> #include <sys / types. h> int accept ( int fd, struct sockaddr addrp, int addrlen ) ; A függvény visszatérési értéke 1 hiba esetén, egyébként pedig egy socket leíró (a kliens socketé). Az fd paraméter egy fájl leíró, ami a mi esetünkben a listen-nel el készített (szerver) socket leíró. Az addrp struktúrába kerül bele a kliens IP címe és a port, amelyen keresztül kapcsolat fel van építve. Itt jegyzem meg, hogy az itt eltárolt port nem egyezik meg azzal a porttal, amelyre a kapcsolat-kérés érkezett, hiszen ezen továbbra is a szerver gyeli a beérkez kéréseket. Így a szerver egy másik (éppen szabad) portot rendel hozzá a kapcsolathoz. Az addrlen paraméter pedig szokás szerint a fent említett címstruktúra méretét jelenti. A függvény visszatérése után a socket leírón (visszaadott érték) keresztül tudunk kommunikálni a klienssel (a read és write függvények felhasználásával). 9. Példa a szerver kapcsolatra kész állapotra hozására A következ kben megnézünk egy egyszer példát, ahol a szerverünk az ös porton gyel, és a várósor mérete 5 (tehát egyszerre 5 klienst engedünk várakozni a kapcsolatra). 12

14 #include <sys / types. h> #include <sys / s o c ket. h> void k a p c s o l a t _ l e t e s i t e s e ( ) { int listen_sock, c l i e n t _ s o c k ; // a s o c k e t l e í r ó k struct sockaddr_in other_addr ; // k l i e n s címe l i s t e n _ s o c k = c r e a t e L i s t e n S o c k e t ( ) ; / varakozosor meretenek b e a l l i t a s a / i f ( l i s t e n ( listen_sock, 5) < 0) { e x i t ( 1 ) ; } / Kapcsolatra várunk... / while ( 1 ) // FIGYELEM!!! v é g t e l e n c i k l u s { c l i e n t _ s o c k = accept ( listen_sock, ( struct sockaddr )&other_addr, &s i n _ s i z e ) ; i f ( c l i e n t _ s o c k == 1) { continue ; // emiatt nem k e l l m e g á l l n i } / Kapcsolat f e l é p í t v e, i n n e n t l jön a kommunikáció / } } 13

15 Látható, hogy a szerver kapcsolat felépítése a createlistensocket metódus meghívásával történik. A paramétere az a port, amelyen a kapcsolatokat várjuk. A visszatér értéke pedig egy leíró socket, melyet listen_sock névvel jelölünk a minta programban. 10. Kommunikáció Ebben a részben gyorsan megtekintjük, hogyan kommunikálhatunk mind a klienssel, mind pedig a szerverrel. A kommunikáció a socketeken keresztül történik, mivel a socketek egyfajta fájlleírók, melyeket használhatunk a read és write függvényekkel. Ezen kívül stream-eket is rá lehet húzni, mellyel valamennyire kultúráltabban tudjuk kezelni az üzeneteket. Igaz, ez nem m ködik az Ural2-n, így az egyszer read és write függvényeket kell alkalmaznunk. Az olvasó függvény meghívásával a program további futása blokkolódik, így amíg nem érkezik semmilyen válasz az olvasott socketr l, programunk áll. Természetesen ha valami hiba történik a távoli oldalon (például megszakad a kapcsolat), akkor err l kapunk visszajelzést, és a read metódus blokkolódása feloldódik. A hibás üzenet lekezelése már a mi feladatunk. Most nézzünk egy-egy (egyszer ) példát mind a stream-ekkel mind pedig a hagyományos módszerekkel történ kommunikációra. FILE socket_stream ; int s o c k e t _ l e i r o ; char b u f f e r [ ] ;... socket_stream = fdopen ( s o c k e t _ l e i r o, " r+" ) ; f p r i n t f ( " h e l l o \n", socket_stream ) ; // e l k ü l d ü n k egy ü z e n e t e t 14

16 f s c a n f ( "%s ", &b u f f e r ) ; // ü z e n e t e t várunk int s o c k e t _ l e i r o ; char b u f f e r [ ] ;... w r i t e ( s o c k e t _ l e i r o, " h e l l o \ r \n", s t r l e n ( " h e l l o \ r \n" )+1); read ( s o c k e t _ l e i r o, b u f f e r, ) ; Stream-ek használatával küldött üzenetek a másik oldalon ugyanúgy jelennek meg, még ha ott hagyományos módszerrel is fogadják ket, tehát a stream-ek használata egyik oldalon nem kötelezi a másik oldal készít jét stream-ek alkalmazására. 11. Kapcsolat lezárása A kapcsolatot a close vagy shutdown metódusokkal lehet lezárni. A close függvény használata: c l o s e ( s o c k e t _ l e i r o ) ; Szerintem ez nem szorul b vebb magyarázatra. Ha stream-eket használunk, akkor a lezáráshoz az fclose metódust kell használnunk. A shutdown metódus hasonló a fent említett close metódushoz, azzal a különbséggel, hogy ezzel a socketet külön le tudjuk zárni írás, olvasás vagy mindkett szemszögéb l. Például: lezárjuk a socket-ünket írásra (ez azt takarja, hogy nem tudunk rajta keresztül üzeneteket küldeni a másik oldalra); amíg a másik oldal észreveszi ezt a lezárást, addig mi tudjuk olvasni a küldött üzenetet. Amikor a másik oldal érzékeli a lezárást, a kapcsolat megszakat, a mi oldalunk ún. fájlvége üzentetet kap, mi is lezárhatjuk a kapcsolatot. int shutdown ( int sd, int a c t i o n ) ; 15

17 A függvény visszatérési értéke 0, hiba esetén pedig 1. Az sd paraméter egy socket leíró. Az action paraméterrel azt adhatjuk meg, hogy mire zárjuk a socket-ünket (0: olvasásra, 1: írásra, 2: mindkett re). 12. Kapcsolat felépítése a kliens szemszögéb l Ez egy áttekint rész, melyben címszavakban áttekintjük a kapcsolat felépítését a kliens szemszögéb l: socket elkészítése, kapcsolat kezdeményezése connect függvénnyel (ezt nevezzük active open-nek: mindig a kliens oldalán történik a kapcsolat kezdeményezése, mivel tudja a szerver címét; SYN jelet küld a szervernek, majd SYN_SENT állapotba kerül, a connect metódus nem tér vissza, a szerver válaszára vár, a szerver válasza tartalmazza a kérés nyugtáját, és jó esetben engedélyt ad a csatlakozásra, ez esetben pedig ESTABLISHED állapotba kerül a socket. 13. Kapcsolat felépítése a szerver szemszögéb l Ebben az áttekint részben megnézzük, hogyan épül fel a kapcsolat a szerver szemszögéb l: socket létrehozása, socket hozzákötése egy lokális (és természetesen szabad) porthoz, felkészül a kapcsolat fogadására a listen metódussal, és LISTEN állapotba kerül (ez a passzív nyitás), SYN üzenet fogadása után SYN_RCVD állapotba kerül a socket, 16

18 nyugta küldése a kliensnek, kapcsolat engedélyezése, nyugta fogadása, majd a socket ESTABLISHED állapotba kerül. 14. Kapcsolat bontása az aktív oldalon Ebben az áttekint részben megnézzük, mi is történik az aktív (a kapcsolat bontását kezdeményez ) oldalon a kapcsolat bontásakor: close metódus meghívása, FIN üzenet küldése a kliens felé, nyugta visszatérésekor a kapcsolat bontása a socket lehetséges állapotai: FIN_WAIT_1 állapot: meger sítésre vár, FIN_WAIT_2 állapot: FIN jelet vár, FIN_WAIT_3 állapot: vár pár másodpercet, majd állapota CLOSED lesz, vagyis rezárult a kapcsolat. 15. Kapcsolat bontása a passzív oldalon Ebben az áttekint részben megnézzük, mi is történik a kapcsolat bontásakor a passzív oldalon: FIN üzenetet kap, hatására CLOSE_WAIT állapotba kerül, nyugtát küld a kapcsolat bontásáról, close metódus meghívása, FIN küldése az aktív oldalnak, állapota LAST_ACK-ra változik, nyugta érkezésekor állapota CLOSED lesz. 17

19 16. Egy korszer kliens-szerver megoldás Egy korszer klienssel szemben nincs sok elvárásunk - hálózati szemszögb l, hisz a szerverre van utalva, nélküle nem képes m ködni (tekinthetjük vékony kliensnek, de egy vastag kliensnek is szüksége van távoli kommunikációra). Feladat olyan szerverek készítése, melyek egyszerre több klienst tudnak kiszolgálni, amennyiben lehetséges (például er forrásigényes feladatoknál nincs értelme több klienst egyszerre kiszolgálni, de ahhoz, hogy ezt a labort sikeresen elvégezzük, nincs szükség ilyen igény feladatokra, és azt hiszem, elvárásként is szerepel több kliens egyszerre történ kiszolgálása). Ezt több folyamat (process) vagy több szál (thread) alkalmazásával tehetjük meg. A szálprogramozás mint általában minden programnyelvben nem könny feladat, így azt tanácsolom, hogy ne ezzel próbálkozzon meg az, aki ezt a jegyzetet olvassa. Természetesen megemlítem a szálak kezelését minimális szinten. Mint már említettem, a program futása blokkolódik mind az accept, mind pedig a read függvén meghívása után. Így felmerül az ötlet: mi volna, ha meg tudnánk nézni, van-e valami (valaki) a csatornán? 17. A legegyszer bb megoldás A legegyszer bb megoldást a select függvény adja. #include <sys / time. h> #include <sys / types. h> #include <unistd. h> int s e l e c t ( int n, fd_set readfds, fd_set w r i t e f d s, fd_set exceptfds, struct timeval timeout ) ; 18

20 A függvény visszatérési értékei: 0, ha lejárt a megadott id ; pozitív érték, ha valamelyik leírón adott m velet végezhet ; hiba esetén pedig negatív. A függvényben leíró csoportokat adunk meg: readfds Ennél a csoportnál arra vár, hogy legyen rajtuk olvasható adat, azaz az egyik leíróra meghívott read (fscanf) függvény meghívódjon. Ha nincs adat, a read metódus 0-val tér vissza. writefds Ez a csoport arra ügyel, hogy a write (fprintf) függvény ne blokkolódjon íráskor. exceptfds Ez a csoport a leírók kivételeire vár. Amelyik leírócsoportra nincs szükségünk, oda NULL-t adunk meg a metódus meghívásakor. A timeout paraméter a várakozási id t jelenti, melynek leteltével mindenképp visszatér a metódus. Ha NULL-t adunk meg, akkor addig vár, míg valami nem történik. A függvény a paraméterként átadott leírócsoportokat törli, és a válaszát ezekbe helyezi el, tehát visszatérés után a readfds változó fogja tartalmazni az olvasható leírókat. A függvény a gyel socketre érkezett kapcsolódásokat és a már kapcsolódott kliensek kéréseit is gyeli, azonban az esetleges hibákat nem, amire külön ügyelni kell. A leírócsoportok kezelésére léteznek speciális makrók: FD_ZERO(fd_set * set) csoport el készítése, FD_SET(int fd, fd_set * set) leírót ezzel tesszük be a csoportba, FD_CLR(int fd, fd_set * set) leíró kivétele a csoportból, FD_ISSET(int fd, fd_set * set) megnézi, hogy a leíró a csoportban van-e. 19

21 18. Kliensek párhuzamos kiszolgálása gyermek folyamatok segítségével Folyamaton a program egy futó példányát értjük. Egy multitasking operációs rendszer több folyamatot képes egyszerre m ködtetni. (Szerencsénkre az Ural2 képes egyszerre több folyamat kiszolgálására, és mivel nem cél belebonyolódni a szálakba, így azt tanácsolom, próbáljuk meg ezt a módszert alkalmazni. Igaz, vannak olyan feladatok, melyek csak szálakkal valósíthatóak meg.) Egy folyamat további folyamatokat (alfolyamatokat) indíthat, így gyakran használják több klienst egyszerre kiszolgálni tudó szerverekhez. PID (Process ID): a folyamat azonosítója (jól jön akkor, ha valamiért nem tudjuk normális módon lekapcsolni). GID (Group ID): csoportazonosító; minden folyamat beletartozik egy csoportba a shellr l egy sorban indítottak egy csoportba kerülnek, tehát ha mi magunk gépeljük be a program nevét a konzolban, akkor egyedüli lesz a csoportban. Alfolyamatokat a fork függvénnyel indíthatunk. #include <unistd. h> pid_t f o r k ( void ) ; A metódus meghívásával a folyamat duplikálja magát, így a szül és gyermek folyamatok nem látják egymás változóit; hiába fut ugyanaz a programkód, mégis más adatokon történik. Ebb l látható, hogy memóriaigényes programokat nem érdemes multiplikálni. A gyermek folyamat a szül csoportjába fog tartozni. A szül folyamat futása a fork metódus visszatérése után a függvény után következ sorral folytatódik. Mivel a fork függvény a gyerek folyamat csoportazonosítójával tér vissza a szül folyamatban, a gyerek folyamatban pedig 0-val (természetesen egy új alfolyamatot indító gyerek folyamatot ebben az esetben szül nek tekintünk), ezért az új folyamatnak 20

22 lehet speciális, a szül t l eltér parancsokat adni: int pid = f o r k ( ) ; i f ( pid == 0) { // parancsok i d e e x i t ( 0 ) ; // folyamat megsz nik } A kliensek csatlakozására különböz módokon (különböz helyekr l) várhatunk: a sz l folyamatban, vagy pedig a gyerek folyamatokban. Az els esetben csak akkor hozzuk létre a gyerekfolyamatokat, ha már kiépült a kapcsolat a klienssel. Ekkor, ha több kliens akar csatlakozni, várakozni kényszerülnek, míg az el ttük lév összes kérésnek elkészül a gyerek folyamat; ám el nye, hogy csak a szükséges mennyiség er forrást foglaljuk le. A második esetben el re létrehozzuk a gyerek folyamatokat, így több kliens egyszerre csatlakozásakor azonnal sorra kerülnek, senki sem várakozik a fork metódus visszatérésére. Ennek azonban megvan a hátránya: több er forrást kötünk le, mint amire szükségünk lehet. A gyermek folyamatokra (pontosabban azok megsz nésére) a wait és waitpid metódusokkal várhatunk. Ezek a metódusok operációs rendszerenként eltérnek, ezért nézzünk utána a manual-ban (man wait és man waitpid). A wait függvény hatására a szül folyamat felfüggeszti a futását, míg egy gyerek folyamat vissza nem tér (meg nem sz nik). A függvény visszatérési értéke a megsz nt folyamat azonosítója. A waitpid metódus meghívásakor a szül folyamat futását felfüggeszti, míg az adott folyamat azonosítójú (PID) gyermek vissza nem tér (meg nem sz nik). Ha bármelyik gyermek folyamat visszatérése megfelel nekünk, 0-t is megadhatunk a függvénnynek. A módszernek megadható a WNOHANG opció, mellyel a függvény akkor tér vissza, ha egy folyamat sem ér véget, tehát nem blokkolódik a program futása. 21

23 #include <sys / types. h> #i n c l u s e <sys / wait. h> pid_t wait ( int s t a t u s ) ; #include <sys / types. h> #i n c l u s e <sys / wait. h> pid_t waitpid ( pid_t pid, int status, int o p tions ) ; 19. Folyamatok közötti kommunikáció pipe-ok segítségével Vannak esetek, mikor a gyerek adatokat kér a szül folyamattól, ami nehéz feladat. Megoldása az inter-process communication (IPC). A pipe m ködése FIFO (First In First Out) elv ; pozícionálásra nincs lehet ség; nincs neve, hanem két fájlleíróval (a vezeték eleje és vége) azonosítjuk, amelyek közül az egyik ír, a másik olvas. Mivel a gyerek folyamatok öröklik a szül folyamatuk leíróit, így a vezetéket is öröklik, tehát kapcsolatot tudnak tartani. #include <unistd. h> int pipe ( int f i l e d e s [ 2 ] ) ; A paraméterben lév tömb els (azaz 0.) elemére lehet írni, a második elemér l pedig csak olvasni lehet. Mivel minden gyermek örököl, ezért több eleje és vége lesz a csatornáknak, a felesleges 22

24 végeket pedig le kell zárni mindkét oldalon. Az olvasható végek lezárásával a read függvény 0-val tér vissza, míg az írási végek lezárása után íráshiba lép fel. Egy vezeték addig él, míg legalább egy eleje és egy vége van. Amennyiben a pipe üres, a read függvény blokkolódik (mint ahogy azt a hálózati kommunikációnál már láttuk). 20. Kliensek kiszolgálása szálak segítségével 21. Signalok 22. Események, amelyek signalt válthatnak ki 23. A session fogalma 24. Daemon megvalósítása 25. Szolgáltatás nyújtása inetd segítségével 23

Dr. Varga Imre. Socket-programozás. C nyelven

Dr. Varga Imre. Socket-programozás. C nyelven Dr. Varga Imre Socket-programozás C nyelven Főbb pontok A kommunikáció alapjai Adatstruktúrák és típusok Konvertáló függvények Rendszerhívások Információs függvények Kliens & Server Server szolgáltatást

Részletesebben

Számítógépes hálózatok

Számítógépes hálózatok Számítógépes hálózatok 7. gyakorlat: SOCKET programozás (C) Gyakorlatvezető: Ács Zoltán Hatodik házi-feladat 1/2 ADAPTÍV FA Tekintsünk 16 állomást, melyek adaptív fabejárás protokollal visznek át csomagokat.

Részletesebben

Dr. Varga Imre Debreceni Egyetem, Informatikai Kar. Socket-programozás. C nyelven, Linux alatt

Dr. Varga Imre Debreceni Egyetem, Informatikai Kar. Socket-programozás. C nyelven, Linux alatt Dr. Varga Imre Debreceni Egyetem, Informatikai Kar Socket-programozás C nyelven, Linux alatt 2019.03.02 Főbb pontok A kommunikáció alapjai Adatstruktúrák és típusok Konvertáló függvények Rendszerhívások

Részletesebben

Hálózati architektúrák laborgyakorlat

Hálózati architektúrák laborgyakorlat Hálózati architektúrák laborgyakorlat 10. hét Dr. Orosz Péter, Skopkó Tamás 2012. szeptember A Unix (C) socket A kommunikációt lehetővé tevő programozási eszköz UNIX fájlleíró (ld. minden egy fájl filozófia)

Részletesebben

Számítógépes hálózatok I.

Számítógépes hálózatok I. Számítógépes hálózatok I. 2.gyakorlat Rétegmodellek Socket programozás bevezető Laki Sándor lakis@inf.elte.hu http://lakis.web.elte.hu Sándor Laki (C) Számítógépes hálózatok I. 1 Miért is jók a rétegek?

Részletesebben

Socket programozás Példák

Socket programozás Példák Socket programozás Példák Áttekintés Client Server socket socket bind connect Connection request listen accept Client / Server Session write read read write close EOF read close 3 Select demo Beej s guide

Részletesebben

FTP: Elkülönített kontroll- és adatkapcsolat. FTP: File Transfer Protocol

FTP: Elkülönített kontroll- és adatkapcsolat. FTP: File Transfer Protocol Áttekintés Számítógépes Hálózatok 2010 2. Hálózati felhasználások -- socket programozás Bruce Maggs és Srinivasan Seshan (CMU) fóliái alapján Felhasználói réteg Kliens-szerver Felhasználás igényei Háttér

Részletesebben

Számítógép-hálózatok: 4. Labor. TCP kliens. A gyakorlat célja:

Számítógép-hálózatok: 4. Labor. TCP kliens. A gyakorlat célja: TCP kliens A gyakorlat célja: TCP kliens alkalmazás írásának az elsajátítása TCP protokoll tulajdonságainak a tanulmányozása Elméleti bevezető: TCP tulajdonságai: A TCP az UDP-vel ellentétben egy összeköttés

Részletesebben

Számítógépes hálózatok

Számítógépes hálózatok Számítógépes hálózatok HETEDIK ELŐADÁS SOCKET programozás C/C++ nyelven AZ ELŐADÁS DIÁKAT KÉSZÍTETTE: ÁCS ZOLTÁN Hálózati programozás bevezetés Általában egy klasszikus hálózati alkalmazás két fő részre

Részletesebben

Számítógépes Hálózatok. 9. gyakorlat

Számítógépes Hálózatok. 9. gyakorlat Számítógépes Hálózatok 9. gyakorlat Wireshark Gombos Gergő Számítógépes hálózatok 2 Wireshark Szűrők definiálására alkalmas input eszközök Csomag összefoglaló nézete Kiválasztott csomag hierarchikus nézet

Részletesebben

Számítógépes Hálózatok 2012

Számítógépes Hálózatok 2012 Számítógépes Hálózatok 2012 8. Hálózati felhasználások -- socket programozás Bruce Maggs és Srinivasan Seshan (CMU) fóliái alapján 1 Áttekintés Felhasználói réteg Kliens-szerver Felhasználás igényei Háttér

Részletesebben

Számítógépes Hálózatok. 5. gyakorlat

Számítógépes Hálózatok. 5. gyakorlat Számítógépes Hálózatok 5. gyakorlat PYTHON ALAPOK V. Socket programozás, UDP 2 Óra eleji kiszh Elérés: https://canvas.elte.hu Számítógépes Hálózatok Gyakorlat 1 3 A kommunikációs csatorna kétféle típusa

Részletesebben

Hálózati architektúrák laborgyakorlat

Hálózati architektúrák laborgyakorlat Hálózati architektúrák laborgyakorlat 6. hét Dr. Orosz Péter, Skopkó Tamás 2012. szeptember Szállítási réteg (L4) Szolgáltatások Rétegprotokollok: TCP, UDP Port azonosítók TCP kapcsolatállapotok Alkalmazási

Részletesebben

TCP szerver készítése

TCP szerver készítése TCP szerver készítése Mérési segédlet Informatika 2 A labor feladat célja, hogy a hallgatót megismertesse a TCP/IP protokollt használó programok készítésével. Ezen belül bemutatásra kerül a Berkley Socket

Részletesebben

Számítógépes Hálózatok ősz 2006

Számítógépes Hálózatok ősz 2006 Számítógépes Hálózatok ősz 2006 2. Hálózati felhasználások -- socket programozás Bruce Maggs és Srinivasan Seshan (CMU) fóliái alapján 1 Áttekintés Felhasználói réteg Kliens-szerver Felhasználás igényei

Részletesebben

Számítógépes Hálózatok GY 3-4.hét

Számítógépes Hálózatok GY 3-4.hét Számítógépes Hálózatok GY 3-4.hét Laki Sándor ELTE-Ericsson Kommunikációs Hálózatok Laboratórium ELTE IK - Információs Rendszerek Tanszék lakis@elte.hu http://lakis.web.elte.hu 1 Teszt canvas.elte.hu Kód:

Részletesebben

URL-LEL ADOTT OBJEKTUM LETÖLTÉSE (1) URL-LEL ADOTT OBJEKTUM LETÖLTÉSE

URL-LEL ADOTT OBJEKTUM LETÖLTÉSE (1) URL-LEL ADOTT OBJEKTUM LETÖLTÉSE Programozás III HÁLÓZATKEZELÉS A hálózatkezeléshez használatos java csomag: java. net Hol találkoztunk már vele? Pl.: URL cim = this.getclass().getresource("/zene/valami_zene.wav"); De pl. adott URL-ről

Részletesebben

Számítógépes Hálózatok GY 6.hét

Számítógépes Hálózatok GY 6.hét Számítógépes Hálózatok GY 6.hét Laki Sándor ELTE-Ericsson Kommunikációs Hálózatok Laboratórium ELTE IK - Információs Rendszerek Tanszék lakis@elte.hu http://lakis.web.elte.hu Teszt 10 kérdés 10 perc canvas.elte.hu

Részletesebben

Számítógép labor V. Egyszer Web szerver. Dokumentáció. Készítette: Ács Gergely (K4C03M) 2003.04.29

Számítógép labor V. Egyszer Web szerver. Dokumentáció. Készítette: Ács Gergely (K4C03M) 2003.04.29 Számítógép labor V. Egyszer Web szerver Dokumentáció (K4C03M) 2003.04.29 Egyszer Web szerver Feladat: Egyszer Web szerver Feladat sorszám: 17 Leírás: Készítsen egy egyszer Web szervert, amely képes statikus

Részletesebben

Számítógépes Hálózatok GY 7.hét

Számítógépes Hálózatok GY 7.hét Számítógépes Hálózatok GY 7.hét Laki Sándor ELTE-Ericsson Kommunikációs Hálózatok Laboratórium ELTE IK - Információs Rendszerek Tanszék lakis@elte.hu http://lakis.web.elte.hu Teszt 10 kérdés 10 perc canvas.elte.hu

Részletesebben

SOCKET használata UDP kliens

SOCKET használata UDP kliens SOCKET használata UDP kliens A gyakorlat célja: Kliens-szerver modell Megismerkedni a SOCKET API alapstrukturáival, működési elveivel UDP kliens megvalósítása (UDP visszhang kliens) Elméleti bevezető:

Részletesebben

TCP szerver. TCP szerver alkalmazás írásának az elsajátítása TCP protokoll tulajdonságainak a tanulmányozása kisérleti úton

TCP szerver. TCP szerver alkalmazás írásának az elsajátítása TCP protokoll tulajdonságainak a tanulmányozása kisérleti úton TCP szerver A gyakorlat célja: TCP szerver alkalmazás írásának az elsajátítása TCP protokoll tulajdonságainak a tanulmányozása kisérleti úton Elméleti bevezető: TCP kilens-szerver alkalmazás: Amint a fenti

Részletesebben

Bevezetés a programozásba I.

Bevezetés a programozásba I. Bevezetés a programozásba I. 6. gyakorlat C++ alapok, szövegkezelés Surányi Márton PPKE-ITK 2010.10.12. Forrásfájlok: *.cpp fájlok Fordítás: a folyamat, amikor a forrásfájlból futtatható állományt állítunk

Részletesebben

UNIX: folyamatok kommunikációja

UNIX: folyamatok kommunikációja UNIX: folyamatok kommunikációja kiegészítő fóliák az előadásokhoz Mészáros Tamás http://home.mit.bme.hu/~meszaros/ Budapesti Műszaki Egyetem Méréstechnika és Információs Rendszerek Tanszék 1 A kommunikáció

Részletesebben

Számítógépes Hálózatok. 3. gyakorlat

Számítógépes Hálózatok. 3. gyakorlat Számítógépes Hálózatok 3. gyakorlat Teszt canvas.elte.hu Számítógépes Hálózatok Gyakorlat 2 NC-NetCat (SoCat), avagy hálózati svájcibicska # szerver imitálása nc -l -p 1234 # kliens imitálása nc destination_host

Részletesebben

UDP idő szerver. UDP protokollal kapcsolatos ismeretek elmélyítése. Egy UPP protokollt használó időszerver megvalósítása

UDP idő szerver. UDP protokollal kapcsolatos ismeretek elmélyítése. Egy UPP protokollt használó időszerver megvalósítása UDP idő szerver A gyakorlat célja: UDP protokollal kapcsolatos ismeretek elmélyítése. Egy UPP protokollt használó időszerver megvalósítása Elméleti bevezető: UDP Protokoll föbb tulajdonságai: Az Internet

Részletesebben

Operációs rendszerek. 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor)

Operációs rendszerek. 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor) Operációs rendszerek 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor) A UNIX System V Release-óta minden rendszer biztosít három egyszerűabsztrakciót a processzusok közti kommunikáció

Részletesebben

Bevezetés a SOCKET programozásba UDP kliens

Bevezetés a SOCKET programozásba UDP kliens Bevezetés a SOCKET programozásba UDP kliens A gyakorlat célja: Megismerkedni a Kliens-szerver modellel A kapcsolodási végpont fogalmának az elsajátítása Megismerkedni SOCKET API alapstruktúráival, (socket,

Részletesebben

SZAKDOLGOZAT ÓBUDAI EGYETEM. Neumann János Informatikai kar Alba Regia Egyetemi Központ

SZAKDOLGOZAT ÓBUDAI EGYETEM. Neumann János Informatikai kar Alba Regia Egyetemi Központ ÓBUDAI EGYETEM Neumann János Informatikai kar Alba Regia Egyetemi Központ SZAKDOLGOZAT OE-NIK Hallgató neve: Berencsi Gergő Zsolt 2010. Törzskönyvi száma: T 000123/FI38878/S-N Tartalomjegyzék Tartalmi

Részletesebben

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában Programozás alapjai C nyelv 8. gyakorlat Szeberényi mre BME T Programozás alapjai. (C nyelv, gyakorlat) BME-T Sz.. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény

Részletesebben

Kommunikáció. Távoli eljáráshívás. RPC kommunikáció menete DCE RPC (1) RPC - paraméterátadás. 3. előadás Protokollok. 2. rész

Kommunikáció. Távoli eljáráshívás. RPC kommunikáció menete DCE RPC (1) RPC - paraméterátadás. 3. előadás Protokollok. 2. rész 3. előadás Protokollok Kommunikáció 2. rész RPC (Remote Procedure Call) távoli eljáráshívás RMI (Remote Method Invocation) távoli metódushívás MOM (Message-Oriented Middleware) üzenetorientált köztesréteg

Részletesebben

Programozás C++ -ban 2007/7

Programozás C++ -ban 2007/7 Programozás C++ -ban 2007/7 1. Másoló konstruktor Az egyik legnehezebben érthető fogalom C++ -ban a másoló konstruktor, vagy angolul "copy-constructor". Ez a konstruktor fontos szerepet játszik az argumentum

Részletesebben

A programozás alapjai 1 Rekurzió

A programozás alapjai 1 Rekurzió A programozás alapjai Rekurzió. előadás Híradástechnikai Tanszék - preorder (gyökér bal gyerek jobb gyerek) mentés - visszaállítás - inorder (bal gyerek gyökér jobb gyerek) rendezés 4 5 6 4 6 7 5 7 - posztorder

Részletesebben

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C programozási nyelv Pointerek, tömbök, pointer aritmetika C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15 Pointerek (mutatók) Pointerek

Részletesebben

Számítógépes Hálózatok GY 4.hét

Számítógépes Hálózatok GY 4.hét Számítógépes Hálózatok GY 4.hét Laki Sándor ELTE-Ericsson Kommunikációs Hálózatok Laboratórium ELTE IK - Információs Rendszerek Tanszék lakis@elte.hu http://lakis.web.elte.hu Teszt 10 kérdés 10 perc canvas.elte.hu

Részletesebben

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism) Programozás alapjai C nyelv 8. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény

Részletesebben

Programozás 6. Dr. Iványi Péter

Programozás 6. Dr. Iványi Péter Programozás 6. Dr. Iványi Péter 1 Előfeldolgozás része Makrók A forrás kódban elvégzi a helyettesítéseket a fordító Csak egyszer végez helyettesítést Nem olyan makrók, mint a LISP vagy Scheme esetén Csak

Részletesebben

Fábián Zoltán Hálózatok elmélet

Fábián Zoltán Hálózatok elmélet Fábián Zoltán Hálózatok elmélet Network Basic Input/Output System Helyi hálózatokon keresztül számítógépek Név alapján azonosítják egymást Szállítási protokollokra épül NetBeui fölött (pl. Win 9x Netbios

Részletesebben

ő ő Ű ü ú ú Ú ü ű ő ő ő ő Á Á Í ü É ő ő ő ő ő É ő ú ú ú ő Á Ö ő

ő ő Ű ü ú ú Ú ü ű ő ő ő ő Á Á Í ü É ő ő ő ő ő É ő ú ú ú ő Á Ö ő ő ő ű ú ő ü ü ü ü ü ő ő ü ü ü ü ü ü ü ü ü ő Ö ő ő ő ő ő Ű ü ú ú Ú ü ű ő ő ő ő Á Á Í ü É ő ő ő ő ő É ő ú ú ú ő Á Ö ő ő ű ő ú ü ú ő ő ő ő ő ő ő ő ő ő ő É ü ű ő ü Á ő ú ű ű ő ő ő É ü ű ő ő ő ű ú ü ú ő ő ő

Részletesebben

Ü ű ö Á Ü ü ö ö

Ü ű ö Á Ü ü ö ö Í Í Ü Ú ö ú Ö Ü ű ö Á Ü ü ö ö ú ü ü ö ü ö ö ö ö Ü Ü ö ö ö ö ö ü ü ö ü Ü ö ú ü ö ü ö ű ö ű Ü ü ö É ö ü ü ö ö ö ö ö ö ö ö Ó ö Ü ü Ü ü ü ö ö ö ö ö ö ö ú ü ö ű ü ö ú ű Ü ö ö ö ü Ü Ü Ü ú ö ö ü ű ö ű ö Á Á Í

Részletesebben

É ő ő ű ú Á ő Á ő ű ő ő ő ő ő ő ő ő ű ú ű ű ő ő ő ű

É ő ő ű ú Á ő Á ő ű ő ő ő ő ő ő ő ő ű ú ű ű ő ő ő ű ő ő ű ú Á ő ű ő ő ő ő Ö Ö Í Á É Á ő Ö Ö Í ő ő ő ő É ő ő ú ú ú ő Á Ö É ő ő ű ú Á ő Á ő ű ő ő ő ő ő ő ő ő ű ú ű ű ő ő ő ű ő ű ő ú Á ő ű ő ő ő ő ő ő Ö ő ú ú Ö ő ő ű ú Á ő ú Ó ű Ó ú ú ú ő ő ú ú ő ő ú ő Ú ú

Részletesebben

Í Ú É ő ő ú ö Ö ú ú ú ö ö ú ö ö ű ö ő ö ö ú ö ő ő ö ö ö ő ő ú ő ú ö ö ö ú ö ö ú ő ö ú ö ű ö ő Ó ő Á ö ő ö ö

Í Ú É ő ő ú ö Ö ú ú ú ö ö ú ö ö ű ö ő ö ö ú ö ő ő ö ö ö ő ő ú ő ú ö ö ö ú ö ö ú ő ö ú ö ű ö ő Ó ő Á ö ő ö ö ö ú ö ö ú ö ú Ü ő ú ő ö ő ő ő ö ö Í Ú É ő ő ú ö Ö ú ú ú ö ö ú ö ö ű ö ő ö ö ú ö ő ő ö ö ö ő ő ú ő ú ö ö ö ú ö ö ú ő ö ú ö ű ö ő Ó ő Á ö ő ö ö Ú ő ö ő ő ő ö ú ú ú ő ö ő ö ő ő ő ö ö ö ö ő ő ö ő ú ő ö ú ö

Részletesebben

ü ö ú ö ú ü ö ü Á Ó ö ö ö ö ú ü ú ü ü ú ú ö ö ü ü ú ü ü ö ö ű ö ü ü ü ü ö ö

ü ö ú ö ú ü ö ü Á Ó ö ö ö ö ú ü ú ü ü ú ú ö ö ü ü ú ü ü ö ö ű ö ü ü ü ü ö ö Í Á Ö Ú Á Á Ó Á ö ú ú ö ú ú ö ü ü ű ü ű ö ö ü ű ö ü ö ú ö ü ú ö ö ü ü ö ü ű ö ö ü ű ö ö ú ö ö ú ú ü ö ú ö ú ü ö ü Á Ó ö ö ö ö ú ü ú ü ü ú ú ö ö ü ü ú ü ü ö ö ű ö ü ü ü ü ö ö ü ö ü ö ö ü ö ö ú ö ü ű ö ü

Részletesebben

ú ú ü ü Á ú ú ü ű ű ú ü ü ü ü

ú ú ü ü Á ú ú ü ű ű ú ü ü ü ü ü ü ü ú ú ü ű ü ű ü ü ű ü ü ü Í ú ú ü ü Á ú ú ü ű ű ú ü ü ü ü ú ü ü Á ű ü ü ü ü ü ü ü ú ü ü Í ú ü É Ö Ö ú Ö Ö Ö ú ú ü ú Á Ö Á ú É ü ú ú É ú ú ú Ü ü ű ú ű É ú ű ü ü Á ú É ü ű ü ú Á É É ú ü Ö Ö Ö ú ú Á Ö

Részletesebben

ú ű ű É ü ű ü ű ű í ü í ő í Ü ő ő ü ú Í ő ő í ú ü ü ő ü

ú ű ű É ü ű ü ű ű í ü í ő í Ü ő ő ü ú Í ő ő í ú ü ü ő ü ü ü ü ü Ó í Ó Éü í ú ű ű É ü ű ü ű ű í ü í ő í Ü ő ő ü ú Í ő ő í ú ü ü ő ü ű ű ű í ü ő ű ü ü ő ú ú ő ü ő ő ő ü ú ű ú ú ú ő ő ú ő ő í ú í Ó ú ü ő ú ú ú ű ú ú Ű ű ő ű ű ő Á ü í ü ú ü í ú ő ú ő ű ő í ő ő

Részletesebben

ő ő ő ő ő ő ú ő ü Á ü ü ő ő ő ő ő ő ő ő ő ő Ö Ó ő ő ő Ö ő ő ő

ő ő ő ő ő ő ú ő ü Á ü ü ő ő ő ő ő ő ő ő ő ő Ö Ó ő ő ő Ö ő ő ő ő ő ő ü ő ő ő ő ő ő ő ú ő ü Á ü ü ő ő ő ő ő ő ő ő ő ő Ö Ó ő ő ő Ö ő ő ő ő ü ő ő ű ü ő ű ő ő ő ő ü ő ő ő ü ő ű ő ő ő ü ő ü ő ő ü ű ő ő ü ü Á ő Á ű ű ü Á ő ű ű ő ű ű ü ű ő ő ő ü ő ű Ó ü Í Á ő ű ő ő ő ő ü

Részletesebben

í ö Á ö ö ö Á í ö ű ü í í ű ö ú ü íí ö ű ö ü ú ü ö í ü ű í ö ö ü ü í ö ü ö ű ö í ű ü í ö í í ü í Á Á í í ü ö ö ü ű í í ö ö ü í ű ü ö í ö ű ü í í ű ö í í í ö ö í ö ö ö ö ö ö í í ű Á Á Á Á Á í í ú í ö ö

Részletesebben

Í ö ö ű ú ö ö Í ö ü ö ü

Í ö ö ű ú ö ö Í ö ü ö ü Í Í ö ú ö ö ö ö ű ö ö ö ö Í ű ű ö ü ú ö ú ú ű Í ö ö ű ú ö ö Í ö ü ö ü ö ú ü ü ö ú ö ű ö Í ű ú ú ö ú ú ű Á É Á ö ű ú Í ö ö ü Í ú ö ú ö ö Í ű ö Í ú ö ö ö Í ö ö ö ö ö Í ö ö ö Í ö ö ö ö Í ű ö Í ú ö Í ö ö ű

Részletesebben

ő ő ő ő ú É ü ú ú ű ú ű ő ő ő ő Á Á ü ő É É É É É É Á Ú Á Á ő ő ő ő ő É Á Á Á ő ő ő Á ü ő ő ü

ő ő ő ő ú É ü ú ú ű ú ű ő ő ő ő Á Á ü ő É É É É É É Á Ú Á Á ő ő ő ő ő É Á Á Á ő ő ő Á ü ő ő ü ő É ő ő ő ő É Ü Ö Ö Ö Í Ö Ö Ö ő Ó Ó Ö Ö Á É É É ő Á É Á Á Ú Á Ú Ö Ö Á Ú Ö Á ű Á ú ő ő ü ü Ó ő ő ő ő ú É ü ú ú ű ú ű ő ő ő ő Á Á ü ő É É É É É É Á Ú Á Á ő ő ő ő ő É Á Á Á ő ő ő Á ü ő ő ü ő ő ő ő Á ü ú ú

Részletesebben

ű Á ü ő ö í ö ö ő ő ő ő ö

ű Á ü ő ö í ö ö ő ő ő ő ö Á É í ü í í í ü í í ö í ű í í í í í í í í í ü ő ö ö ö ű ő ö ű Á ü ő ö í ö ö ő ő ő ő ö ö ő ő ő ö ö Ű ú Á ö ú ú ö ü í ő ő ú É í í ő ö í ö ú í ő ü í í í í í ö í ű í í í í í í í í í ü ő ö ö ö ű ű ő ű ü í Ö

Részletesebben

É Í ü ú É ü ő ő ő ő ú ő ú ü ü ő ü ú ü ű ú ú ü ü Í ü ű ő ő É ő

É Í ü ú É ü ő ő ő ő ú ő ú ü ü ő ü ú ü ű ú ú ü ü Í ü ű ő ő É ő ő Ü É Í ü ú É ü ő ő ő ő ú ő ú ü ü ő ü ú ü ű ú ú ü ü Í ü ű ő ő É ő ő ő ú ő ő ő ú ő ü ú ű ő ű É Í ő É Ü Í ő ü ő ő ő ő ő ő ú ü ű ő ú ő ű ő ő ő ű ő ű ő É Í Ú Ö Á Á É Á Á Á Ő Á É Á Ö Á Ö É É É ü ő Á ő ú ü ő

Részletesebben

í Ó ó ó í ó ó ó ő í ó ó ó ó

í Ó ó ó í ó ó ó ő í ó ó ó ó í Ú Á Í í Ó ó ó í ó ó ó ő í ó ó ó ó í Ó Ó í ő ó Í í í í Ó í ó í í Ő É Ú Ű Í É Á ó Á É É ó ó í É Ü Í ő í ó í ó í Ő Ő Á Ó Ó Á É É Á Á É É Ő Á Ú É í ó Á í Á í í ő í í Ő Ő É Ú Ű Í É Á ó Á É Ö Í Í É ó ó í Ú

Részletesebben

ü ő ő ü ü ő ő ű í í ű ő ő ő ü ő ő í í ő ő ő ő ő ő ü ü í ő Ö ő ü í ő ü í í ő ü ő í ő ő í í ő ü ü í ő ü í ő í ő í ő ü í ő í ü í í ő

ü ő ő ü ü ő ő ű í í ű ő ő ő ü ő ő í í ő ő ő ő ő ő ü ü í ő Ö ő ü í ő ü í í ő ü ő í ő ő í í ő ü ü í ő ü í ő í ő í ő ü í ő í ü í í ő ő Á Á Á Ű Ö É Á Ö ő ő ő ű Ö ű ú ő ü ű ü ü ő ü ő ő ú í ü í í ü ő í ő ő í ő ő í ő ő í ü ő í ű ő ü ű ő ü í ü ü ő ü ü í ü í ü ü Ú í Ő Í ü ő ü ü í Ö í í ü ő ő ü ü ő ő ű í í ű ő ő ő ü ő ő í í ő ő ő ő ő ő ü ü

Részletesebben

ú ú ö ö ü ü ü ü ű ü ü

ú ú ö ö ü ü ü ü ű ü ü Ü ú ű ű ú ű ú ú ö ö ü ü ü ü ű ü ü ö ö ö ö ö ö ű ö ö ö ö ö ö ö ö ö ü ü ü Ú ú ü ű ü ú ű ö ű ú ö ö ö ö Á ú ú ű Á ú Á Á Á ü ö ö Á ö ö ü Á ú Á ú Á Á Ö Á Á ö ű ö ö ü ú ü ú ö ú ű ú ú ü ü ü ü ű ű Ő ú ö ű ú ú ű

Részletesebben

Í Í Ó ű Ü Ó Ó Ü ü Ö Í Ü Í Í ú Ö Ó Í ú ú Ö Ó É Í ű ú

Í Í Ó ű Ü Ó Ó Ü ü Ö Í Ü Í Í ú Ö Ó Í ú ú Ö Ó É Í ű ú ű É Í Á Á Á Ó É Á Á Ó Í Ö Á Á Á Ö ü Í Ó Í ű ű ü ú Í Í Ó ű Ü Ó Ó Ü ü Ö Í Ü Í Í ú Ö Ó Í ú ú Ö Ó É Í ű ú ü Í ú Ü Ű Ó Ó Í ú Í ú Ö Ó ü Ü ü ű Ó ú Í ü É Í Í Á Á Ó Í Á ú Ö Í Ó ú ú ú Í ú ú ű ú Ü ü ü Í Á ü ú Í ú

Részletesebben

ű í ú ü ü ü ü ü Ó í ü í í í É Á

ű í ú ü ü ü ü ü Ó í ü í í í É Á ü ű ü ú ű í ú í ű í ú ú ú ú ű í ú ü ü ü ü ü Ó í ü í í í É Á ű í í í Á ü É í í Ö Ö Á í Á É Á ú ú ú í ű í ú ű í í í É í í É í ű í ü í ú ű í ű í É í Ú í í í ű í ú ű í í í ü í í ú í ú í Ö ű í í í ü ü Ő í í

Részletesebben

ö ö ö ö ö ö ö ü ö ü ö ű ö ú ü ű ö ü Í ö ú ü ü ű ö ú ü Á ü

ö ö ö ö ö ö ö ü ö ü ö ű ö ú ü ű ö ü Í ö ú ü ü ű ö ú ü Á ü Á Ó ö ü ü ü ú ú ü ü ö ü Ő ö ö ö ü ú ü Á ö ö ö ö ö ö ö ö ü ö ü ö ű ö ú ü ű ö ü Í ö ú ü ü ű ö ú ü Á ü ö ö ü ü ö ü ö Ó ö ö ü ü ö ü ö ú ö ú ü ö ü É É Á ü ű Ö ű ú ö ö ú ö ú ö ú ö ű ü Ö ö ű ü ú ö ü ú ű ö ű ú

Részletesebben

Í Í Í Ü Ó Ó Ö Á Ü Ü Ó Ü Ü Ó Ö Í É Ö

Í Í Í Ü Ó Ó Ö Á Ü Ü Ó Ü Ü Ó Ö Í É Ö Ö É Ö Í Í Í Ü Ó Ó Ö Á Ü Ü Ó Ü Ü Ó Ö Í É Ö Ü Ü Á É Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ú Í É Ó Á Ü Á É Á Ü Í Í Í Í Ü Í Í Í Í Í É Ö Á Í Á Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Ü Í Í É Í Í É É Í Í Í É Í Ü Í Ü Á Ü Ü

Részletesebben

ő ö ő ú ő ö ö ő ó ő ö ü ú ö ö ó ő ö ü ó ó ó ó ő ő ő ó ó ú ő ü ő ö ö ó ü ö ö ő ű ö ö ő ú ú ó ö ő ű ö ó

ő ö ő ú ő ö ö ő ó ő ö ü ú ö ö ó ő ö ü ó ó ó ó ő ő ő ó ó ú ő ü ő ö ö ó ü ö ö ő ű ö ö ő ú ú ó ö ő ű ö ó ö ú Á ő ű ü ő ó ö ö ú ö ú ü ó ó ű ö ú ó ó ó ő ö ö ő ú ó ö ö ő ő ő ő ö ű ü ü ü ő ü ü ő ő ü ó ő ő ö ő ú ő ö ö ő ó ő ö ü ú ö ö ó ő ö ü ó ó ó ó ő ő ő ó ó ú ő ü ő ö ö ó ü ö ö ő ű ö ö ő ú ú ó ö ő ű ö ó ó ü ű

Részletesebben

é ö é Ö é é ő í ó í é ő ö ú é ó é ő ü ü é ó ö é é ó é é ö é ő í é é ő é é ö é ű ö é í ó é é í ö í ó í ó é é ö ó í ó ó í ó é é ö ő í ó ó í ó ü é í ü

é ö é Ö é é ő í ó í é ő ö ú é ó é ő ü ü é ó ö é é ó é é ö é ő í é é ő é é ö é ű ö é í ó é é í ö í ó í ó é é ö ó í ó ó í ó é é ö ő í ó ó í ó ü é í ü é í ü é ö é é ő ü é é é ú é ó Í é é ő Í é ó ö í é ö é Ö é é ő í ó í é ő ö ú é ó é ő ü ü é ó ö é é ó é é ö é ő í é é ő é é ö é ű ö é í ó é é í ö í ó í ó é é ö ó í ó ó í ó é é ö ő í ó ó í ó ü é í ü é ö ő

Részletesebben

ú ü ü ú Ö ú ü ü ü ü ü ú ü ú ü ű Í ü ü ű ü ű Ó ü Ü ű ú ú Á ü ű ű ü ü Ö ü ű ü Í ü ü

ú ü ü ú Ö ú ü ü ü ü ü ú ü ú ü ű Í ü ü ű ü ű Ó ü Ü ű ú ú Á ü ű ű ü ü Ö ü ű ü Í ü ü ű ü ü ú ü ú ú ű ü ú ú ü ü Ó Ö Í ü ú ú ű Ö ú ú ú ü ü ú ÍÍ ú ü ü ú Ö ú ü ü ü ü ü ú ü ú ü ű Í ü ü ű ü ű Ó ü Ü ű ú ú Á ü ű ű ü ü Ö ü ű ü Í ü ü ü Ü ü ü ú ü ű ü ü ü Ü ú ú ü ü ü ü Í ü ü ú ű ü ü ü ü ü ü Í Í ü

Részletesebben

ö ö ó ú ö ö ú ü ó ö ö Í ö ö ö ü ó ö ö ú ú ö ü ó ü ó ü ö ú ü ó ü ö ó Á Á ö ü ú ó ö ü ü ö ó ü ü Á ü ö ü ö ü ö ö ö ü ö ú ö ö ö ü ú ö ú ö ű ú ú ü ö ó ö ö

ö ö ó ú ö ö ú ü ó ö ö Í ö ö ö ü ó ö ö ú ú ö ü ó ü ó ü ö ú ü ó ü ö ó Á Á ö ü ú ó ö ü ü ö ó ü ü Á ü ö ü ö ü ö ö ö ü ö ú ö ö ö ü ú ö ú ö ű ú ú ü ö ó ö ö ö ö Ő Ö ü ö Ö ü ü ü ó ö ö ö ü ö ú ü ü ö ö ú ú ö ú ó ú ó ü ú ú ú ú ó ú ö ú Á ö ö ö ó ú ö ö ú ü ó ö ö Í ö ö ö ü ó ö ö ú ú ö ü ó ü ó ü ö ú ü ó ü ö ó Á Á ö ü ú ó ö ü ü ö ó ü ü Á ü ö ü ö ü ö ö ö ü ö ú ö ö ö

Részletesebben

Ö Ö Ú Ó Ö ű Ő Ő ű ű Ü Ő Ó Ő

Ö Ö Ú Ó Ö ű Ő Ő ű ű Ü Ő Ó Ő ű É ű ű É Ö Ö Ú Ó Ö ű Ő Ő ű ű Ü Ő Ó Ő É Ó Ó É ű Ö ű Ö ű ű ű Ú Ú Ö ű ű ű Ö ű ű ű ű ű ű ű ű Ú É É É É Ö Ö Ú Ö É ű ű ű ű ű ű ű Ó ű Ö Ö ű ű ű É ű ű ű ű ű ű ű ű ű É ű ű ű ű ű ű ű ű ű ű Ö ű ű ű Ü ű ű ű ű Ö ű

Részletesebben

í í ü í í í í í Ó ő ő í í í Ú ü Ú í í Ú ő ü Ú ü ő

í í ü í í í í í Ó ő ő í í í Ú ü Ú í í Ú ő ü Ú ü ő É Á Á ő ü í ü ü í ü ő ü ő ü ü ü í í í í í ü í í ő í í ü í í í í í Ó ő ő í í í Ú ü Ú í í Ú ő ü Ú ü ő ő í ő í ű ű í í ü í í ő í í í í í ű í ő í í í í ü í ő í ő í ü í ű ő ű ü í ü ü í ő ő ü ő í í Ö ü í ü ü

Részletesebben

é ú é é é é é é é é é é é é ú é ö é é é ö Ő é é é ú é é é é é é é é ö é é é ö é Ö é é ö é ö é é é ű é ö ö é ö é é ö ö é é ö ö é ö é Ö é ú é é é é é é

é ú é é é é é é é é é é é é ú é ö é é é ö Ő é é é ú é é é é é é é é ö é é é ö é Ö é é ö é ö é é é ű é ö ö é ö é é ö ö é é ö ö é ö é Ö é ú é é é é é é é ű ö Ö é é ö ú é é é é ö ö é ö é é é ö ö é é é ö ö é ű é é ö é é é é é é é é é é ö é ö é é é ű ö ű ö é é é Ö Ú Í é ö é é Ő ö ö ú é é é é é é é é é é ű é é é ú é é é ű ú é é é é é ö é ö é ö é é ö é é é

Részletesebben

í ó ő í é ö ő é í ó é é ó é í é é í é í íí é é é í é ö é ő é ó ő ő é ö é Ö ü é ó ö ü ö ö é é é ő í ő í ő ö é ő ú é ö é é é í é é í é é ü é é ö é ó í é

í ó ő í é ö ő é í ó é é ó é í é é í é í íí é é é í é ö é ő é ó ő ő é ö é Ö ü é ó ö ü ö ö é é é ő í ő í ő ö é ő ú é ö é é é í é é í é é ü é é ö é ó í é ű ű ö é ő ó í ö ő ü é ő é ü ő ö ő ö é é í ö ő ö ó ő é ó í ö ő ü é é é é é ő é é é é í ő ö é é ő ű ő ö í ö é é é Ö ű ú ő é é ű ő í ü ö é é ő ó ö ö ő é é é é é é é é é é ő ü í í é ú í í í Ú í é ú é ő ó ó

Részletesebben

ó ú ú ü ú ő ó ő ő ó ó ó ö ó ü ő ó ő ö ü ü ó ö ő É ó ö ö ö ó ó ö ü ü ö ü ó ó ő ó ü ó ü ü ö ö É ú ó ó ö ú ö ü ü ó ó ó ü Á ö ö ü ó ö ó ö ö ö ö ó ó ö ó ó

ó ú ú ü ú ő ó ő ő ó ó ó ö ó ü ő ó ő ö ü ü ó ö ő É ó ö ö ö ó ó ö ü ü ö ü ó ó ő ó ü ó ü ü ö ö É ú ó ó ö ú ö ü ü ó ó ó ü Á ö ö ü ó ö ó ö ö ö ö ó ó ö ó ó Ü Ű Ö É Á Á ö É É Ö Ú Ü ö ü ő ő ö ő Á ő ó ő ü ü ö ö ú É ű ó ü ű ö ú ü ö ó ö ö ü ű ö ó ó ö ö ö ö ü ű ö ő ö ö ó ö ö ő ó ő ü ő ó ő ö ö ő ü ü ö ő ó ú ú ü ú ő ó ő ő ó ó ó ö ó ü ő ó ő ö ü ü ó ö ő É ó ö ö ö ó

Részletesebben

ö ö Ö ó ó ö ó ó ó ü ö í ü ú ó ó í ö ö ö ó ö ü ú ó ü ö ü ö ö Ö ü ö ö Ö ó

ö ö Ö ó ó ö ó ó ó ü ö í ü ú ó ó í ö ö ö ó ö ü ú ó ü ö ü ö ö Ö ü ö ö Ö ó ü ö ö Ö ü ü ö ö Ö ö ó ö ú ó ü ö ö ö Ö í ó ü í í ü ö í í ó ó ü ö ü ö ö ü í ó ö ö Ö ó ó ö ó ó ó ü ö í ü ú ó ó í ö ö ö ó ö ü ú ó ü ö ü ö ö Ö ü ö ö Ö ó ö ö Ö ü í ö Ö ö ö ó ü í ö ó ó ü ö ó í ü ü ü ö ö ü í ü

Részletesebben

ü É ö É É ö ö ö ü ö ö Á ű ö ű ű ű Á Í ö ö Ó ö

ü É ö É É ö ö ö ü ö ö Á ű ö ű ű ű Á Í ö ö Ó ö Ü É ű ü ü ö Í ü ö ö ü ű Í Í ü ű ö Ö ö ö ö Í ü ü É ö É É ö ö ö ü ö ö Á ű ö ű ű ű Á Í ö ö Ó ö ü ü ü Í ü ö ö ö ö ö ö ö ü Í Í ű ö ö ö ü ü ö ü ö ö ö ü ö ö ö ö ü ü ű ü ö ö ö ü ö ü ű ö ü ö ö ű Í ü ü ű Í ö ü ö

Részletesebben

ő ö ő ű ó ö ó ű Í Ö Ö Á Í Ó Ö Ü É Ö Ö Ö Á Á Ö É Á Ö

ő ö ő ű ó ö ó ű Í Ö Ö Á Í Ó Ö Ü É Ö Ö Ö Á Á Ö É Á Ö Í Í Ő Ó Ü Ö Ő ő ö ő ű ó ö ó ű Í Ö Ö Á Í Ó Ö Ü É Ö Ö Ö Á Á Ö É Á Ö ő ö ő Í ó ö ó ú Í Ö Í ÍÍ É Ó Ü Ü Ó Ó Ö É Ö ő ö ő ű ó ö ú Í Ö Í Ö Í Ö Ó Ó Ó Ó Ü Ö Ü Ü É Ú Ö Ó Ó Í Í ő ö ő ű ó ö ó ú É Ö Í Í ÍÍ Í Í Í É Í

Részletesebben

ű ú ú Ö ó Ö ó ó ó Ö ű ó ű ű ü Á ó ó ó ó ü ó ü Ö ó ó ó Ö ű ű ü Ö ű Á ú ú ú ó ű í í Ő ú Á É Ö í ó ü ű í ó ű ó Ö ú Ő ú ó í ú ó

ű ú ú Ö ó Ö ó ó ó Ö ű ó ű ű ü Á ó ó ó ó ü ó ü Ö ó ó ó Ö ű ű ü Ö ű Á ú ú ú ó ű í í Ő ú Á É Ö í ó ü ű í ó ű ó Ö ú Ő ú ó í ú ó ü ű ú ü ű ú ú Ö ó Ö ó ó ó Ö ű ó ű ű ü Á ó ó ó ó ü ó ü Ö ó ó ó Ö ű ű ü Ö ű Á ú ú ú ó ű í í Ő ú Á É Ö í ó ü ű í ó ű ó Ö ú Ő ú ó í ú ó ü í í í í ó ü ó Ö ó ü Ö í ó ű ó ó ó Ö Ö ó ó í í Ö Ö ó ó í Ö ó ű í í ü

Részletesebben

ö Ó ű ö ó í ó ü ö Ó ó í ö ö ó Ö ó ö í ó í ó Á í ó Á Á Ő ú ü ó Í ü ú ü

ö Ó ű ö ó í ó ü ö Ó ó í ö ö ó Ö ó ö í ó í ó Á í ó Á Á Ő ú ü ó Í ü ú ü ú Ö Ú ú ú ó Ő Ö ü Ú ú ö Ö Í ó í ü ü ó ó ó Í ö ö ö ö í ü ó ö ü ü ú í ű ö ó ó ö ö ö ű ö ó ó ö ö Ó ű ö ó í ó ü ö Ó ó í ö ö ó Ö ó ö í ó í ó Á í ó Á Á Ő ú ü ó Í ü ú ü ü ö ö ó ó Í ü ö ó ú ü ü ö ó ö ö Í í ó ó

Részletesebben

í ü í ü ő ő ü Í ő ő ő ú í ő ő ö ö ö ű ü í ő ő í ú ö ö ú ő ő ú í ő í ő ö ö í ő ü ü í ő ö ü ü ú í í ü ő í ü Í í í í ö ő ö ü ő í ő ő ü ű ő ő í ő í í ő ő

í ü í ü ő ő ü Í ő ő ő ú í ő ő ö ö ö ű ü í ő ő í ú ö ö ú ő ő ú í ő í ő ö ö í ő ü ü í ő ö ü ü ú í í ü ő í ü Í í í í ö ő ö ü ő í ő ő ü ű ő ő í ő í í ő ő ö Ö ő ü ü ő Á ü ö ö ő ő ű ő ü ő Ö ö ő í ő ö í ö ö ő ő ö í ú Á Á Á í Á í ü Á ő í í ő Á í ő ő ú ő ö ö ő Í í ő ő í í ö í ő Ó ő ő í ö ő ő ü ö ö ő ö í ö ő í ü í ü ő ő ü Í ő ő ő ú í ő ő ö ö ö ű ü í ő ő í ú ö

Részletesebben

ö ö ö Ö ö ú Ö í Ö ű ö í Ö í ö ü ö í ú Ö Ö ö í ű ö ö í ö ö Ő ö í ü ö ö í Ö ö ö í ö í Ő í ű ű í Ö Ó í ö ö ö ö Ö Ö ö í ü ö ö Ö í ü Ö ö í ö ö ö ö ö Ö ö í

ö ö ö Ö ö ú Ö í Ö ű ö í Ö í ö ü ö í ú Ö Ö ö í ű ö ö í ö ö Ő ö í ü ö ö í Ö ö ö í ö í Ő í ű ű í Ö Ó í ö ö ö ö Ö Ö ö í ü ö ö Ö í ü Ö ö í ö ö ö ö ö Ö ö í Á ö Á Á É Ö í ö Ö Á Ó Ű ú ű Ü ö ö ú ö ú í ö í ö ö ö í Ö ö í ö Ő ü ö ö í Á Ö Ú ű Ö í Ö ö ö Ö ü ű ö ű ö Ö ü ö Ö Ö Ö ö í ö ö Ö ö í Ö ö Ú ö ö ö ö Ö ö ú Ö í Ö ű ö í Ö í ö ü ö í ú Ö Ö ö í ű ö ö í ö ö Ő ö í ü

Részletesebben

Í Ó ü ü í ü ü ü í Í í É í í Í Í ü ü ü í Í ü

Í Ó ü ü í ü ü ü í Í í É í í Í Í ü ü ü í Í ü É Á í É Á Á ü Ú ű í Í Í Ü ü ú ü Í ü ü ü ü Í ü Í í ü ü ü ü ü ü ü ü ü í Í Ó ü ü í ü ü ü í Í í É í í Í Í ü ü ü í Í ü Í Ó Í Ó ü ü ü Í ü ü É ü ü ü ü ü É ü ü Í ü ü ü Í Ó Í Ó í Á í É ü í Í ü í Í í í ü ü É ü ü

Részletesebben

ö ü ü ú ó í ó ü ú ö ó ű ö ó ö í ó ö í ö ű ö ó Ú ú ö ü É ó í ö Ó Á í ó í í Ú ö ú ö ű ü ó

ö ü ü ú ó í ó ü ú ö ó ű ö ó ö í ó ö í ö ű ö ó Ú ú ö ü É ó í ö Ó Á í ó í í Ú ö ú ö ű ü ó ö Ö ó ü Ú ú ű ó ú ü ö Ö ü ó ü ü ó ó ö ö ó ó ö Ú ö í ó ö ö ö í í ú ü ó ö ü ü ú ó í ó ü ú ö ó ű ö ó ö í ó ö í ö ű ö ó Ú ú ö ü É ó í ö Ó Á í ó í í Ú ö ú ö ű ü ó ó ó Ó Ú ö ú ó í í ú ó ö ü ü Ö ó ü ü í Ö Ö ú

Részletesebben

É Ö Á Í Á Ó Ö ü

É Ö Á Í Á Ó Ö ü Ö ű Ö ő ü ő ő ő ű Ö Ö ü Á Á É Ö Á Í Á Ó Ö ü Ö ű ű Ö ű ű ú ű ű ú ú ő ő ü ű ű É Ö ú ű ő ű ű ú ő ü Ö ú ú ő ő ú ű ü ő ü ű ú ú ű Ü ő ő Ó ü É Ó Ö Ö ú ü ü ü ü Ű ú Ö Á ü É Ó ű Á Ö Á ű ü ú Ö ű ű ű ü ő ő ő Á ő ő

Részletesebben

ű ú ü ü ü Í ü ö ü ö ü ö ü Ó ü ö ü ö ö ü ű ű ú ü ö ö ü Ó ö ű ü ö ú ö ö ü ü ű ü ü ö ö ü ü ú ö ö ü ü ú ü

ű ú ü ü ü Í ü ö ü ö ü ö ü Ó ü ö ü ö ö ü ű ű ú ü ö ö ü Ó ö ű ü ö ú ö ö ü ü ű ü ü ö ö ü ü ú ö ö ü ü ú ü ű ö ű ö ü ú ú ú ö ö Í ú ü ú ú ö Í ü ö ü ü ö ü ö ü ü ű ö ü ü ö ü ú ú ú ú ú ű ú ü ü ü Í ü ö ü ö ü ö ü Ó ü ö ü ö ö ü ű ű ú ü ö ö ü Ó ö ű ü ö ú ö ö ü ü ű ü ü ö ö ü ü ú ö ö ü ü ú ü ű Á Í ű ű ö ü ö ü ü ú ű ö

Részletesebben

ó É ó í ó ó í í ö í ó í ö ö ö ü ö ó ó ó ü ú ö ü ó ó ö ö ü ü ü ö ö ó ö í ó ű Ü ó í ú í ö í ö í Í ó ó í í ö ü ö ö í ö í ö ö ö ü ó í ö ö ó í ú ü ó ö

ó É ó í ó ó í í ö í ó í ö ö ö ü ö ó ó ó ü ú ö ü ó ó ö ö ü ü ü ö ö ó ö í ó ű Ü ó í ú í ö í ö í Í ó ó í í ö ü ö ö í ö í ö ö ö ü ó í ö ö ó í ú ü ó ö Á Ö É Á É Ő Ü Ü ü ö Ö ü ú ö í ü ü ó ó Á ö ó ö ö ö Ö í ü ü ü í í ü ü ö ü ü ü ü ö í ó ó Ő ó ó ö ó ö í ü í Í ó í ó ö í ó ó ö ó ó ö ó ó É ó í ó ó í í ö í ó í ö ö ö ü ö ó ó ó ü ú ö ü ó ó ö ö ü ü ü ö ö ó ö í

Részletesebben

ű ú Í Ó Á ú Ű ű Ő Ö Á ú Ű Ü ú ú Á ú ű

ű ú Í Ó Á ú Ű ű Ő Ö Á ú Ű Ü ú ú Á ú ű É Á É É Ó Á ű Á ű ú ú ű ű ú ű ű ú Á ú ű ú ű ú ű ú ű Á ű ú ű ű Ö Ú Á ű ű Á ű ű ú Í Ó Á ú Ű ű Ő Ö Á ú Ű Ü ú ú Á ú ű ű ú ű ű ű ű ű ú ű ű ű ű ű ű Á ú ű ű ú ú ű ű ű ű ű ú ű Á ű ű ű ű ű ű ú ű ú ű ú ű Ö ú ű Ö

Részletesebben

Ü

Ü Ó Á ú Á É Ü Ö Ö Ö É É É Ö É Ü Ö É É É É É Ó Ö Ó Í Ö Ö Ö Ö Í Ö Ö É É É Í Ö Ö É Ö Í Á Ó Í Á É É Ó É Ú Á Í É É É Ö Ö Ó Ö Ö Ö Ö Ó Ó Ó Í Ü Ö É É Ö Ó Ö Ó ö Ö Ö Ö Ö Ö Ó Ü Ö Ó É ű É É É É É É É É Í Ö Ó Ö É Ö Ö

Részletesebben

í ó í ó ó ó í í ü ú í ú ó ó ü ü í ó ü ú ó ü í í ü ü ü ó í ü í ü ü í ü ü í ó ó ó í ó í ü ó í Á

í ó í ó ó ó í í ü ú í ú ó ó ü ü í ó ü ú ó ü í í ü ü ü ó í ü í ü ü í ü ü í ó ó ó í ó í ü ó í Á Ö ü ó Ö ü ó ó ó ó ó ó ó ó ó ó í ü í í ü ü ü ü ó ü ü ú ó ü ü ü í ó í ü ü í ó í ó í ó ó ó ó í ó ó ó í í ó ü ú É Ö í í í ú ó í ü í ó í ó ó ó í í ü ú í ú ó ó ü ü í ó ü ú ó ü í í ü ü ü ó í ü í ü ü í ü ü í ó

Részletesebben

í í É í ó ó É ö í ó í ó í ó ó í ó í í ó ó ó í ö ö ö ö í í í ó ó ö ó

í í É í ó ó É ö í ó í ó í ó ó í ó í í ó ó ó í ö ö ö ö í í í ó ó ö ó Á Á Ó Ö Á í í É í ó ó É ö í ó í ó í ó ó í ó í í ó ó ó í ö ö ö ö í í í ó ó ö ó ó í í ó ó ű ű ö ű ú í ö ó ó í ó ó ö ö Ü ú ó Ü ö ö í ö í ó ó ó ű í ó ö ö í í ö ö í ö Í ó ö í ö ö ó ó ö ö í ó ö ö í í ö í ú Í

Részletesebben

Ö ő ü Ö Ö Ő ü ő Ö Ö ü ű Á Í Ö ű ü ő ő ő Ö ü ü ő ő ő Ü ü ő ő ő ü ő ő ü ü

Ö ő ü Ö Ö Ő ü ő Ö Ö ü ű Á Í Ö ű ü ő ő ő Ö ü ü ő ő ő Ü ü ő ő ő ü ő ő ü ü Ö ő ü Ö ő ü Ö Ö Ő ü ő Ö Ö ü ű Á Í Ö ű ü ő ő ő Ö ü ü ő ő ő Ü ü ő ő ő ü ő ő ü ü ü ő ő ő ú ű ő ő ú Ö ő ü ő ő Ö ő ü ő ő ő ő ő ő ü ü ő ő Ö ő Í Ö Ö Ö ü Ü Ö ő ő Ö ü Ö Ö ü Ö Ö ü Ö Ü Ö ü ü ü ő ű Ö ő Ö ü ü ü ő Ű

Részletesebben

É Í Á Á É Ü Ó É É É É Í Ó Ó Ő Á Á É Á É É É É Á É É Á Á É É Á É Í

É Í Á Á É Ü Ó É É É É Í Ó Ó Ő Á Á É Á É É É É Á É É Á Á É É Á É Í Í É Í Á Á É Ü Ó É É É É Í Ó Ó Ő Á Á É Á É É É É Á É É Á Á É É Á É Í É Á É Í Í É É Í Í Í Á Í Á Á ö ó ö ö ő ő ő ö ö ó ő ű ö ö ö ö ü ö ö ö ü ü ó ö Á ó ó ö ö ő ő ő ő ö ó ü ó ó ó ó ó ó ö ü ü ó ö Ó Í Í É É

Részletesebben

ó ö í í ü Ű Ö ó ó ű ö ü Í í í ö Ö Ó ö Ű Ö ú ó ó í í ű ö ö ö ö í ó ö ö í ö ű ö ű ö ö ö ö ö í ó Ö Ö ü ú ö ó ü ö Ö ű ö Ö ü ó ö ö ó ö ö Ó í ű ö ű ö ö ű í

ó ö í í ü Ű Ö ó ó ű ö ü Í í í ö Ö Ó ö Ű Ö ú ó ó í í ű ö ö ö ö í ó ö ö í ö ű ö ű ö ö ö ö ö í ó Ö Ö ü ú ö ó ü ö Ö ű ö Ö ü ó ö ö ó ö ö Ó í ű ö ű ö ö ű í ö Ö ü ö Ü Ö Ö ü ú í Ó ü ü ö ó ö ö Á ó ó ó ü í ö í ö ö ó ö ö í í Ő í ó Ő ü ú ó ö ö ó ö í ü ó ó ö í ó í ó ö í í ü Ű Ö ó ó ű ö ü Í í í ö Ö Ó ö Ű Ö ú ó ó í í ű ö ö ö ö í ó ö ö í ö ű ö ű ö ö ö ö ö í ó Ö Ö ü

Részletesebben

ű ö ú ö ö ö ö í ű ö ö ö ű ö ö ö í ü ú í ű í ö í ú ű í ü ö ö ú ö í ö ű ú ü ö ö í ö ü ö ú ű ö ö ö í Á í ü í ö ü ö í ü ö Ő ü ö í ű ü ö í í í í í

ű ö ú ö ö ö ö í ű ö ö ö ű ö ö ö í ü ú í ű í ö í ú ű í ü ö ö ú ö í ö ű ú ü ö ö í ö ü ö ú ű ö ö ö í Á í ü í ö ü ö í ü ö Ő ü ö í ű ü ö í í í í í ü ö É ű ö ú ö ö ö ö í ű ö ö ö ű ö ö ö í ü ú í ű í ö í ú ű í ü ö ö ú ö í ö ű ú ü ö ö í ö ü ö ú ű ö ö ö í Á í ü í ö ü ö í ü ö Ő ü ö í ű ü ö í í í í í í í ö Á í ű í ü ö í ű ö í ú ű í ű ü ö í ű ö ű ö ö ű ö

Részletesebben

É ú É ö ö ű ö ö ö ú ú ú ű ű ú ö ű ö ű ű ü ö ö ü ű ö ü ö ö ö ö ú ü ö ö ö ú ö ö ú ö ö ú ü ú ú ú ű ü ö ö ű ú ű ű ü ö ű ö ö ö ű ú ö ö ü ú ü ö ö ö ü ú ö ű

É ú É ö ö ű ö ö ö ú ú ú ű ű ú ö ű ö ű ű ü ö ö ü ű ö ü ö ö ö ö ú ü ö ö ö ú ö ö ú ö ö ú ü ú ú ú ű ü ö ö ű ú ű ű ü ö ű ö ö ö ű ú ö ö ü ú ü ö ö ö ü ú ö ű É É É Ó Á É ú É ö ö ű ö ö ö ú ú ú ű ű ú ö ű ö ű ű ü ö ö ü ű ö ü ö ö ö ö ú ü ö ö ö ú ö ö ú ö ö ú ü ú ú ú ű ü ö ö ű ú ű ű ü ö ű ö ö ö ű ú ö ö ü ú ü ö ö ö ü ú ö ű ü ű ö ö ú ö ú ö ö ö ö ö ü ú ü ö ö ö ö ö ü

Részletesebben

ű ú ó ó ü í Á Á ú ó ó ó ó ó ó ó ó ó ó ó ó ó ó í ó ü É ű ü ó í ü í í í í í ó í ü í í ó ó Á

ű ú ó ó ü í Á Á ú ó ó ó ó ó ó ó ó ó ó ó ó ó ó í ó ü É ű ü ó í ü í í í í í ó í ü í í ó ó Á ü ű ú í í ü í ű ú ó ó ü í Á Á ú ó ó ó ó ó ó ó ó ó ó ó ó ó ó í ó ü É ű ü ó í ü í í í í í ó í ü í í ó ó Á ó ű ó í Á í ó ü í ó ó í ü ü ű ó í ü í í ü í í í ó í ó í ü ó Ó í ó ó ó í í í ü Í ó ó í í í í ó í í

Részletesebben

í í í í ó í ó ö ö í ű ü ó ó ü ú Á Á ó ó ó ó ó ó í ó ö ö ü Ó ö ü í ö ó ö í í ö í ó ó í ö í ú ó ú í ö ú ö ö ö í ó ó ó ú ó ü ó ö í ó ó í í í Á í ó ó ó

í í í í ó í ó ö ö í ű ü ó ó ü ú Á Á ó ó ó ó ó ó í ó ö ö ü Ó ö ü í ö ó ö í í ö í ó ó í ö í ú ó ú í ö ú ö ö ö í ó ó ó ú ó ü ó ö í ó ó í í í Á í ó ó ó Í ö í ú ú ó ú Ö ü Ú ú Ö ü ó ü ó ö ö ó ó ö í ó í ó í Í ó í ö ö ö ó í ü ó ö ü ü ú ó ó ó ó ó ó í ó ó ó í ú ó ó ó ó ó í ü í í í í ó í ó ö ö í ű ü ó ó ü ú Á Á ó ó ó ó ó ó í ó ö ö ü Ó ö ü í ö ó ö í í ö í ó ó

Részletesebben

ü ö ö ő ü ó ó ú ó

ü ö ö ő ü ó ó ú ó ö ö ő ü ü ü ő ö ü ö ö ő ü ó ó ú ó Ő Ö ü ö Ö ó ü ü ü ö ö Ö ó ó ü ö ó ő ü ó ü ő ó ő ó ü ö ö ö í í ó ő ú ü ö ö ó ü ö ő í ő ő í ő ü ó ő ü ű ö ú ó ú í ü ó ü ö ó ó ü ö Ö ó ő í ó ő ü ö ü ő ö ö ö ö Ö Ó ő ü ü ó

Részletesebben