Sveučilište u Zagrebu PMF Matematički odsjek. Mreže računala. Vježbe 04. Zvonimir Bujanović Slaven Kožić Vinko Petričević

Like dokumenter
Programiranje 1 grupno spremanje (zadaci) datoteke

Kartlegging av leseferdighet Trinn 2 og 3 på bosnisk

1 REALNE FUNKCIJE REALNE VARIJABLE

do minimalno 8 kreativnih objava mjesečno Povlaštena cijena nakon završetka akcije: 900,00 kn

Interprosess kommunikasjon. Berkeley Sockets. Hvordan identifiserer jeg hvem jeg vil snakke til? Hva må programmene gjøre?

Løsningsforslag til eksamen i INF103

Neprekidne funkcije nestandardni pristup

1 - Prvi deo upitnika

Složeni tipovi podataka

Zadatak 1 strukture (C110) P2: Jedanaesta nedelja Strukture i liste. Strukture na jeziku C (2) Strukture na jeziku C (1)

Strukture. Strukturirani (složeni) tip podataka koji definiše korisnik. Razlike u odnosu na niz

1. DHB-E 18/21/24 Sli art ELEKTRONIČKI PROTOČNI GRIJAČ VODE

Riješeni zadaci: Funkcije

ALUMINIJSKE VODILICE ZA ODJELJIVANJE PROSTORA

Del 1 En oversikt over C-programmering

Tru64: Uvod - alati i naredbe. Dinko Korunić, InfoMAR d.o.o. v1.2, travanj 2006.

CJENIK OSTALIH USLUGA

Primena računara u fizičkoj hemiji. Profesor: Miloš Mojović Asistent: Aleksandar Ignjatović

Poslovanje Centri izvrsnosti za poslovnu podrπku

Neko kao ti. Sara Desen. Prevela Sandra Nešović

Izmena i dopuna konkursne dokumentacije

Uvod u Veb i Internet tehnologije HTML

OLE for Process Control

DO ŽIV LJA JI HAK L BE RI JA FI NA

Sustavi za rad u stvarnom vremenu

Kako dostaviti logo. USBnet. Powered by

Program socket server

4. Grafič ke funkčije

CJENIK OSTALIH USLUGA

Prije uporabe Sigurnost...1 Važne napomene...1. Tablet FISKAL1... 2

VOLKSWAGEN Golf V (1K) V TDi (AZV) Motor -> Priručnik za popravak -> Remen razvodnog mehanizma: uklanjanje/postavljanje

Eksamen FSP5822/PSP5514 Bosnisk nivå II Elevar og privatistar / Elever og privatister. Nynorsk/Bokmål

SETNINGER OG SETNINGSLEDD REČENICE I DELOVI REČENICE

ZADACI ZA KVALIFIKACIONI ISPIT IZ HEMIJE. 1. Napišite elektronsku konfiguraciju broma, čiji je atomski broj Z= 35.

Projekat EUROWEB+ Ovo je program namenjem isključivo razmeni, a ne celokupnim studijama.

L A TEX Sage i SageTEX

Matematičke metode u kemiji Numeričke metode u kemiji

Objektno orijentisano programiranje 2. Tipovi podataka u C#

Del 4 Noen spesielle C-elementer

Topografske karte. Dr. sc. Aleksandar Toskić, izv. prof.

Uvod u web dizajn i obrada slike

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

Løsningsforslag til eksamen 24. november 2015

Kapittel 1 En oversikt over C-språket

OSNOVNI KONCEPTI GRAFIČKOG PROGRAMIRANJA Interaktivna manipulacija oblikom igra glavnu ulogu u CAD/CAM/CAE sistemima. Programiranje koje kreira

MATLAB matrični laboratorij Interaktivni alat (kalkulator), programski jezik, grafički procesor

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Korisnički priručnik. Modena E501

BOSANSKI LCD TV UPUTSTVA 0516MTH-VT-VT

Nr. 11/238 EØS-tillegget til Den europeiske unions tidende KOMMISJONSFORORDNING (EU) nr. 605/2014. av 5. juni 2014

Prevela Ta nj a Mi lo s a v lj e v ić

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Ord og begreper. Norsk Morsmål: Tegning (hvis aktuelt)

Løsningsforslag til eksamen i INF103

BOSANSKI LCD TV UPUTSTVA 0716MTH-VT-VT

PRAVILNIK O NAČINU I UVJETIMA OBAVLJANJA DJELATNOSTI ELEKTRONIČKIH KOMUNIKACIJSKIH MREŽA I USLUGA. - neslužbeni pročišćeni tekst -

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

FIL FILOZOFIJA. Ispitna knjižica 2 FIL.25.HR.R.K2.12 FIL IK-2 D-S025. FIL IK-2 D-S025.indd :31:00

1. 0BLINEARNE STRUKTURE PODATAKA

PC i multimedija 3. deo: Audio

Hilja du ču de snih sunac a

Oving 2. Oppgave 1. #include <stdio.h> int main(int argc, char **argv) { char *navn = argv[1]; printf ("Navnet ditt er %s\n", navn); } Oppgave 2

Glasilo Hrvatske Provincije Sv. Jeronima Franjevaca Konventualaca

Cs preprosessor. Dagens tema. Betinget kompilering

MINIMARK stampac za industrijsko obelezavanje

Činjenice o hepatitisu A, B i C i o tome kako izbjeći zarazu

ZBIRKA PRAKTIČNIH RADOVA IZ KOMPLETA DIJELOVA MT- radio

ISC Bind9. Pripremio: Dinko Korunić Verzija: 1.0, ožujak Bind9 / str. 1

HRVATSKI. LCD televizor UPUTE 0516MTH-VT-VT

FRACTAL d.o.o. Elektrotehnički i informatički inžinjering i konzalting Kupreška 37, SPLIT. PowerCAD 4.1

Programmeringsspråket C

Eksamen FSP5819 Bosnisk I PSP5512 Bosnisk nivå I. Nynorsk/Bokmål

IN 147 Program og maskinvare

Za sinagogu sam vezan muzikom

/* Adresu promenjive x zapamticemo u novoj promeljivoj. Nova promenljiva je tipa pokazivaca na int (int*) */ int* px;

GJØVIK INGENIØRHØGSKOLE

ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU PROGRAMIRANJE 2 MATERIJALI ZA PRIPREMU ISPITA. verzija:

Programmeringsspråket C

HRVATSKI. LCD televizor UPUTE 0716MTH-VT-VT

Fag ITD Datateknikk. Laboppgave 7. Programmering av Arduino med Ethernet shield. Kort løsningsforslag.

Forelesning 1. Introduksjon til (eller repetisjon av) TCP/IP Datasikkerhet

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

Del 2 Tabeller, arrays, strenger

Løsningsforslag til eksamen i IN 147 og IN 147A

6107 Operativsystemer og nettverk

VERTIKALNA POLARIZACIJA

Programmeringsspråket C

Skriveni blagoslov. Kao što svi znate, skoro smo se vratili kući sa jednog

Likovna umjetnost umjetnost, matematika i algoritmi

CJENIK POŠTANSKIH USLUGA U UNUTARNJEM PROMETU

Godište I. Broj 3 Međugorje Ožujak Cijena 2,5 KM / 10 Kn

Programmeringsspråket C Del 3

6105 Windows Server og datanett

6105 Windows Server og datanett

Život na selu. CL Country Living (1946) Ellen G. White

Programmeringsspråket C Del 3

Dagens tema: Datastrukturer

CJENIK POŠTANSKIH USLUGA U MEĐUNARODNOM PROMETU PRIMJENA OD GODINE

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Transkript:

Sveučilište u Zagrebu PMF Matematički odsjek Mreže računala Vježbe 04 Zvonimir Bujanović Slaven Kožić Vinko Petričević

Klijent / Server paradigma internet daje infrastrukturu koja omogućava komunikaciju između bilo koja 2 računala preciznije, komunikacija se odvija između aplikacija: Firefox na jednom stroju komunicira sa web-serverom na drugom traceroute aplikacija komunicira sa firmware-om u router-ima da bi aplikacije A i B mogla komunicirati, jedna od njih mora inicirati kontakt sa drugom drugim riječima, jednoj treba usluga koju druga aplikacija pruža klijent (client) aplikacija koja aktivno inicira kontakt server aplikacija koja pasivno čeka kontakt 20.10.2014. Mreže računala - Vježbe 04 2

Klijent / Server paradigma klijentski software tipično... aktivno inicira kontakt sa serverom je aplikacija koja privremeno postaje klijent kada joj zatreba usluga neke udaljene aplikacije, također obavlja i neke druge lokalne operacije (izračunava nešto, crta sučelje za korisnika...) je aplikacija koju korisnik pokrene, koristi neko vrijeme dok mu je potrebna, i onda ju ugasi (dakle, živi samo jednu sesiju) se izvršava lokalno na osobnom računalu korisnika ne zahtjeva specijalizirani hardware niti operativni sustav 20.10.2014. Mreže računala - Vježbe 04 3

Klijent / Server paradigma serverski software tipično... pasivno čeka kontakt proizvoljnog udaljenog klijenta je specijalizirana aplikacija koja služi isključivo tome da pruža jednu konkretnu uslugu može posluživati nekoliko udaljenih klijenata odjednom se pokreće automatski kada se računalo pali, radi cijelo vrijeme dok je računalo upaljeno, obrađuje brojne klijentske zahtjeve kako dolaze ( živi kroz mnogo sesija) se izvršava na specijaliziranom računalu (zato često samo to računalo nazivamo npr. web-server, mail-server ) zahtjeva snažan hardware i sofisticirani operativni sustav 20.10.2014. Mreže računala - Vježbe 04 4

Primjeri interakcije klijenata i servera obradit ćemo nekoliko primjera komunikacije između servera i klijenta redovito će način protokol komunikacije biti TCP daytime točno vrijeme http dohvaćanje web-stranice echo vrati nazad ono što ti pošaljem ssh izvršavanje naredbi na udaljenom računalu (s)ftp prijenos datoteka između računala http://beej.us/guide/bgnet/ http://devmentor.org/articles/network/socket%20programming(v2).pdf (Windows Sockets; pomalo zastarjelo) 20.10.2014. Mreže računala - Vježbe 04 5

daytime promatramo zasad samo klijenta, serveri cijelo vrijeme rade na većini UNIX strojeva i komuniciraju na portu 13 port 13 klijent server (crna kutija) IP: 12.34.56.7 20.10.2014. Mreže računala - Vježbe 04 6

daytime klijent prvo treba stvoriti okruženje za komunikaciju treba definirati protokol koji želi koristiti Ja bih s nekim pričao koristeći internet i TCP protokol port 13 klijent server (crna kutija) IP: 12.34.56.7 20.10.2014. Mreže računala - Vježbe 04 7

socket Definira okruženje za komunikaciju tzv. "utičnicu". Za svako računalo/aplikaciju s kojom se komunicira unutar klijenta/servera potrebno je stvoriti po jednu utičnicu. Utičnicom će se jednoznačno u ostalim funkcijama određivati tko s kim i na koji način komunicira. int socket( int domena, int tip, int protokol ); domena = PF_INET (komunikacija internetom) tip = SOCK_STREAM za TCP protokol tip = SOCK_DGRAM za UDP protokol protokol = 0 za sve naše potrebe povratna vrijednost = -1 ako je došlo do greške (tada poziv funkcije perror daje detalje o greški) 20.10.2014. Mreže računala - Vježbe 04 8

Primjer: socket int mojsocket = socket( PF_INET, SOCK_STREAM, 0 ); if( mojsocket == -1 ) perror( "socket" ); 20.10.2014. Mreže računala - Vježbe 04 9

daytime jednom kad ima utičnicu, klijent treba specificirati na koji server se želi spojiti treba znati i IP-adresu i port Ja bih se spojio na IP-adresu 12.34.56.7 i to na port 13 port 13 klijent server (crna kutija) IP: 12.34.56.7 20.10.2014. Mreže računala - Vježbe 04 10

connect Specificira IP-adresu i port sa kojom se komunicira preko dane utičnice. Za tu svrhu postoji posebna struktura: struct sockaddr_in { short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; sin_family = vrsta adrese, za nas AF_INET (komunikacija internetom) sin_port = port na serveru na koji se spajamo (broj između 0 i 65535) sin_addr = binarna IP-adresa servera sin_zero = polje čiji se svi elementi uvijek postave na 0 20.10.2014. Mreže računala - Vježbe 04 11

connect int connect( int sock, struct sockaddr *servaddr, int lenaddr ); sock utičnica koju smo stvorili sa funkcijom socket servaddr napunjena sockaddr_in structura (koristimo cast!), čuva podatke o serveru lenaddr = sizeof( servaddr ) povratna vrijednost = -1 ako nije uspjelo (pozovi i perror za ispis detalja), 0 inače Funkcija connect pokušava ostvariti konekciju između klijenta i udaljenog servera. Potrebno ju je pozivati samo za spojne protokole poput TCP (nije potrebna za UDP). 20.10.2014. Mreže računala - Vježbe 04 12

Primjer: connect char dekadskiip[] = "12.34.56.7"; struct sockaddr_in adresaservera; adresaservera.sin_family = AF_INET; adresaservera.sin_port = htons( 13 ); if( inet_aton( dekadskiip, &adresaservera.sin_addr ) == 0 ) printf( "%s nije dobra adresa!\n", dekadskiip ); memset( adresaservera.sin_zero, '\0', 8 ); if( connect( mojsocket, (struct sockaddr *) &adresaservera, sizeof( adresaservera ) ) == -1 ) perror( "connect" ); 20.10.2014. Mreže računala - Vježbe 04 13

htons / htonl / ntohs / ntohl Svaki broj (2 ili 4 byte-ni) koji se šalje preko mreže treba imati poredak byte-ova u tzv. Network orderu, koji se može razlikovati od poretka byte-ove korištenog na lokalnom računalu (tzv. Host order). Gornje funkcije rade odgovarajuće konverzije: short htons( short x ) prima x u Host orderu, vraća u Network long htonl( long x ) prima x u Host orderu, vraća u Network short ntohs( short x ) prima x u Network orderu, vraća u Host long ntohl( long x ) prima x u Network orderu, vraća u Host Funkcija inet_aton vraća binarnu IP-adresu u Network orderu, pa tu ne treba konverzija. 20.10.2014. Mreže računala - Vježbe 04 14

daytime sada je ostvarena konekcija između klijenta i servera i možemo razmijenjivati podatke po daytime protokolu protokol je vrlo jednostavan: server pošalje trenutni datum i vrijeme klijentu i odmah zatvori konekciju port 13 klijent Netko se spojio na mene! Poslat ću mu točno vrijeme i prekinuti razgovor da me više ne gnjavi. server (crna kutija) IP: 12.34.56.7 20.10.2014. Mreže računala - Vježbe 04 15

recv Služi za primanje poruke sa udaljenog računala. Blokira daljnje izvršavanje programa sve dok zaista nešto ne primi. ssize_t recv( int sock, void *buffer, size_t duljinabuffera, int opcije ); sock utičnica stvorena sa sock i povezana sa connect buffer adresa (najčešće polje znakova; može biti i npr. adresa samo jednog int-a) na koju spremamo podatke koji dolaze sa servera duljinabuffera = sizeof( buffer ) opcije = 0 za sve naše potrebe 20.10.2014. Mreže računala - Vježbe 04 16

recv recv prima maksimalno onoliko podataka kolika je duljinabuffera. Povratna vrijednost: 0, ako je druga strana prekinula konekciju -1, ako je došlo do pogreške (pozovi perror za detalje) inače, broj byte-ova koji je stigao od udaljenog računala Problem: kako znati kada je druga strana završila sa slanjem? Nekoliko mogućih scenarija: 1. znamo da poruka mora biti velika N byte-ova ponavljamo recv sve dok ukupno ne primimo N byte-ova 2. druga strana prvo kaže: poslat ću M byte-ova, mi primimo tu poruku, i zatim učitavamo sve dok ne primimo M byte-ova 3. druga strana je prekinula konekciju 20.10.2014. Mreže računala - Vježbe 04 17

recvfrom uoči: da bismo mogli primati podatke sa recv, nužno treba postojati konekcija ako koristimo npr. UDP protokol (SOCK_DGRAM kod poziva funkcije socket), ne trebamo pozivati funkciju connect, ali onda umjesto recv koristimo: ssize_t recvfrom( int sock, void *buffer, size_t duljinabuffera, int opcije, struct sockaddr *servaddr, socklen_t *lenaddr ); prva 4 parametra su isti kao kod recv, zadnja 2 su isti kao kod connect 20.10.2014. Mreže računala - Vježbe 04 18

recv Primjer za daytime (znamo da će server prekinuti konekciju kada nam pošalje točno vrijeme): char buffer[100]; int primljeno = 0; // koliko smo byte-ova ukupno primili int novoprimljeno; // koliko je primljeno u zadnjem recv while( 1 ) { novoprimljeno = recv( mojsocket, buffer + primljeno, sizeof( buffer ) primljeno - 1, // zbog '\0' 0 ); if( novoprimljeno == -1 ) { perror( "recv" ); exit(0); } else if( novoprimljeno == 0 ) break; else primljeno += novoprimljeno; } buffer[primljeno] = '\0'; printf( "%s", buffer ); 20.10.2014. Mreže računala - Vježbe 04 19

daytime kada smo završili komunikaciju sa serverom i utičnica nam više ne treba, možemo ju zatvoriti Sad znam koliko je sati i ne moram više pričati sa serverom. Maknut ću ovu utičnicu, ne treba mi više! port 13 klijent server (crna kutija) IP: 12.34.56.7 20.10.2014. Mreže računala - Vježbe 04 20

close Prestanak upotrebe utičnice, oslobađa se memorija koju je ona trošila. int close( int sock ); sock utičnica koju više ne trebamo koristiti povratna vrijednost = -1 ako je došlo do greške (perror za detalje), 0 inače. Primjer: if( close( mojsocket ) == -1 ) perror( "close" ); 20.10.2014. Mreže računala - Vježbe 04 21

Zadatak 1 Spojite sve navedene primjere u funkcionalni program. Pokušajte se spojiti na više različitih daytime-servera tako da modificirate IP-adresu servera. 20.10.2014. Mreže računala - Vježbe 04 22

daytime server Sada ćemo napisati i server. Koristit ćemo neki drugi port (npr. 54321) za našu aplikaciju (13 je rezervirani port!) klijent I meni isto treba utičnica da bih mogao komunicirati. Napravit ću je sa funkcijom socket. server 20.10.2014. Mreže računala - Vježbe 04 23

daytime server Kada napravi utičnicu, server treba reći na kojem će portu vršiti komunikaciju sa klijentima. Više utičnica može komunicirati putem jednog porta. Moguća je komunikacija i kroz više portova. klijent Ja sa klijentima želim komunicirati na portu 54321. server 20.10.2014. Mreže računala - Vježbe 04 24

bind Specificira na kojem će portu i kojoj IP-adresi komunicirati utičnica napravljena sa socket(). int bind( int sock, struct sockaddr *servaddr, socklen_t addrlen ); sock utičnica koju smo napravili sa socket() servaddr napunjena sockaddr_in structura (koristimo cast!), čuva podatke o serveru. Ako ne znamo serverovu (tj. vlastitu) IPadresu, ili znamo da imamo samo jednu IP-adresu, možemo postaviti servaddr.s_addr = INADDR_ANY; i to polje će automatski biti ispunjeno na ispravan način. addrlen = sizeof( servaddr ); povratna vrijednost = -1 ako je došlo do greške (perror za detalje), 0 inače 20.10.2014. Mreže računala - Vježbe 04 25

bind Primjer: struct sockaddr_in mojaadresa; mojaadresa.sin_family = AF_INET; mojaadresa.sin_port = htons( 54321 ); mojaadresa.sin_addr.s_addr = INADDR_ANY; memset( mojaadresa.sin_zero, '\0', 8 ); if( bind( listenersocket, (struct sockaddr *) &mojaadresa, sizeof( mojaadresa ) ) == -1 ) perror( "bind" ); 20.10.2014. Mreže računala - Vježbe 04 26

daytime server Sada server treba rezervirati utičnicu da jednostavno čeka da neki klijent pokuša uspostaviti konekciju na portu 54321... port 54321 klijent Ova utičnica koju imam će služiti za osluškivanje klijenata. server 20.10.2014. Mreže računala - Vježbe 04 27

listen Rezervacija utičnice koja će služiti serveru za osluškivanje nadolazećeg kontakta na danom portu. int listen( int sock, int maxkonekcija ); sock utičnica koju smo napravili sa socket() i dali joj port pomoću bind() maxkonekcija koliko maksimalno klijenata odjednom može čekati na uslugu servera. Ostali će pri pokušaju connect-a dobiti pogrešku "Connection refused" povratna vrijednost = -1 ako je došlo do greške (perror za detalje), 0 inače 20.10.2014. Mreže računala - Vježbe 04 28

Primjer: listen if( listen( listenersocket, 10 ) == -1 ) perror( "listen" ); Serveri često istovremeno komuniciraju s više klijenata. Za komunikaciju sa svakim od klijenata obično imaju po jednu utičnicu (vidi dalje), dok je jedna utičnica rezervirana samo za osluškivanje novih nadolazećih konekcija (tzv. listener-socket). 20.10.2014. Mreže računala - Vježbe 04 29

daytime server Kada klijent pokuša uspostaviti komunikaciju sa serverom, server ju može i ne mora prihvatiti. I ja zapravo imam port kroz koji komuniciram, napravio mi ga je connect! port 54321 klijent Da li da prihvatim spoj s ovim klijentom? server 20.10.2014. Mreže računala - Vježbe 04 30

accept Služi za prihvaćanje prijedloga konekcije od strane klijenta. Doznat ćemo klijentovu adresu i dobiti novu utičnicu za komunikaciju s njim. int accept( int listenersock, struct sockaddr *klijentaddr, unsigned int *lenaddr ); listenersock listener utičnica kojom osluškujemo dolazeće konekcije. Možemo ju ponovno upotrijebiti. klijentaddr adresa klijenta, tip joj je sockaddr_in, trebamo napraviti cast lenaddr treba postaviti na adresu varijable u kojoj je sizeof(klijentaddr) klijentaddr popunjava funkcija accept (a ne mi) povratna vrijednost = -1 ako je došlo do greške (perror za detalje), inače nova utičnica za komunikaciju sa klijentom 20.10.2014. Mreže računala - Vježbe 04 31

Primjer: accept struct sockaddr_in klijentadresa; unsigned int lenaddr = sizeof( klijentadresa ); int commsocket = accept( listenersocket, (struct sockaddr *) &klijentadresa, &lenaddr ); if( commsocket == -1 ) perror( "accept" ); char *dekadskiip = inet_ntoa( klijentadresa.sin_addr ); printf( "Prihvatio konekciju od %s\n", dekadskiip ); Funkcija accept blokira daljnje izvršavanje serverske aplikacije sve dok neki klijent ne pokuša pristupiti serveru. 20.10.2014. Mreže računala - Vježbe 04 32

daytime server Nakon prihvaćanja konekcije, server može poslati podatke o točnom vremenu. nova utičnica (commsocket) port 54321 klijent Sada klijentu trebam poslati podatke o točnom vremenu. server 20.10.2014. Mreže računala - Vježbe 04 33

send Slanje podataka udaljenom računalu. Funkcionira po posve istoj logici kao recv (jedino što sad unaprijed znamo koliko byte-ova treba poslati). ssize_t send( int sock, const void *buffer, size_t duljinabuffera, int opcije ); sock utičnica preko koje se odvija komunikacija buffer adresa (najčešće polje znakova; može biti i npr. adresa samo jednog int-a) na koju spremamo podatke koji dolaze sa servera duljinabuffera = sizeof( buffer ) opcije = 0 za sve naše potrebe 20.10.2014. Mreže računala - Vježbe 04 34

sendto podatke pomoću send može slati i klijent ako klijent koristi npr. UDP protokol (SOCK_DGRAM kod poziva funkcije socket), ne treba pozivati funkciju connect, ali onda umjesto send koristi: ssize_t sendto( int sock, void *buffer, size_t duljinabuffera, int opcije, struct sockaddr *servaddr, socklen_t *lenaddr ); prva 4 parametra su isti kao kod send, zadnja 2 su isti kao kod connect 20.10.2014. Mreže računala - Vježbe 04 35

Primjer: #include <time.h> send time_t trenutnovrijeme; time( &trenutnovrijeme ); char buffer[100]; sprintf( buffer, "%s", ctime( &trenutnovrijeme ) ); int trebaposlati = strlen( buffer ); int poslano = 0; // broj do sada poslanih byte-ova int poslanozadnje; // koliko je poslano u zadnjem send while( poslano!= trebaposlati ) { poslanozadnje = send( commsocket, buffer + poslano, trebaposlati - poslano, 0 ); if( poslanozadnje == -1 ) perror( "send" ); else poslano += poslanozadnje; } 20.10.2014. Mreže računala - Vježbe 04 36

daytime server Nakon što je poslao točno vrijeme, server može prekinuti konekciju tako da zatvori komunikacijsku utičnicu. Nakon toga može nastaviti osluškivati eventualne nove klijente. port 54321 klijent Ne da mi se više pričati s tobom, klijente! server 20.10.2014. Mreže računala - Vježbe 04 37

Zadatak 2 Spojite sve navedene primjere u funkcionalni daytimeserver koji može posluživati više klijenata (uoči: ne odjednom, već jednog za drugim!) Promijenite daytime-klijenta iz Zadatka 1 tako da se može spajati na port 54321. Spojite se promijenjenim klijentom na server iz prve točke. 20.10.2014. Mreže računala - Vježbe 04 38

Zadatak 3 Napišite echo-klijent. Echo-klijent treba: spojiti se na računalo student na port 7 (tamo se nalazi echo-server) u petlji učitavati riječi sve dok se ne učita riječ kraj svaku učitanu riječ poslati serveru pročitati serverov odgovor i ispisati ga na ekran Što radi echo-server? Napišite ga (sami odaberite port komunikacije). Prilagodite svoj echo-klijent tako da sa komandne linije dobiva IP-adresu i port echo-servera na kojeg se treba spojiti. Testirajte sa echo-serverom na studentu i onim kojeg ste sami napisali. 20.10.2014. Mreže računala - Vježbe 04 39

Zadatak 4 Napišite primitivni web-browser koji će moći prikazati jednu webstranicu u tekstualnom modu. za web se koristi tzv. http-protokol. web-browser (tj. http-klijent) treba: spojiti se na proizvoljni host-name kojeg dobijete iz komandne linije na port 80 (tamo se uvijek nalaze http-serveri) poslati serveru poruku "GET / HTTP/1.0\n\n" učitavati odgovor servera i ispisati ga na ekran Modificirajte program tako da ispisujete samo ono što se nalazi između <body> i </body> (ili <BODY> i </BODY>). Nemojte ispisivati ništa što se nalazi između znakova "<" i ">" (niti njih). 20.10.2014. Mreže računala - Vježbe 04 40