INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

32
INF01018 – Aula Pr´ atica 1 – Cliente-Servidor e Multicast Lucas Mello Schnorr, Alexandre Silva Car´ ıssimi {lmschnorr,asc}@inf.ufrgs.br http://www.inf.ufrgs.br/lmschnorr/ad/ INF01018 – Sistemas Operacionais Distribu´ ıdos e de Redes Sala 102 – Pr ´ edio 67 – 05 Setembro 2006 1 / 30

Transcript of INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Page 1: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

INF01018– Aula Pratica 1 –

Cliente-Servidor e Multicast

Lucas Mello Schnorr, Alexandre Silva Carıssimi{lmschnorr,asc}@inf.ufrgs.br

http://www.inf.ufrgs.br/∼lmschnorr/ad/

INF01018 – Sistemas OperacionaisDistribuıdos e de Redes

Sala 102 – Predio 67 – 05 Setembro 2006

1 / 30

Page 2: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Roteiro

1 Introducao

2 Cliente-Servidor

3 Multicast

4 Referencias

2 / 30

Page 3: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Introducao

Dar suporte as aulas teoricas 04 e 05

Utilizacao de exemplos com codigo fonte

Duas linguagens de programacao: Java e C

Programas Cliente/Servidor e Multicast

Download de Exemplos

http://www.inf.ufrgs.br/∼lmschnorr/ad/aula1.tar.gz

3 / 30

Page 4: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Introducao – Parte do Cliente/Servidor

Do lado do servidorRecebe comandos dos clientesSe comando for igual a hora, enviar hora local aoclienteSe comando nao for conhecido, envia mensagem aocliente avisando

Do lado do clienteCria uma datagrama com o comandoEnvia ao servidorAguarda uma resposta

4 / 30

Page 5: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Introducao – Parte do Multicast

Dois programasPrograma Receptor

Cria um socket multicastFaz bind desse socket a um endereco multicastAguarda mensagens do socket e imprime na tela

Programa EnviadorCria um socket multicastEntra no grupo multicastEnvia uma mensagem ao grupo

5 / 30

Page 6: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor

UDPServico orientado a DatagramasSem confirmacao de recebimento ou retentativas

Do lado do servidorRecebe comandos dos clientesSe comando for igual a hora, enviar hora local aoclienteSe comando nao for conhecido, envia mensagem aocliente avisando

Do lado do clienteCria uma datagrama com o comandoEnvia ao servidorAguarda uma resposta

6 / 30

Page 7: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

UDP usando a linguagem C

Principais funcoes

socket (int domain, int type, int protocol)

bind (int sockfd, struct sockaddr *addr, socklen t len)

recvfrom (int s, void *buf, size t len, int flags,struct sockaddr *from, socklen t *fromlen)

sendto (int s, const void *buf, size t len, int flags,const struct sockaddr *to, socklen t tolen)

7 / 30

Page 8: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor UDP em C – 1/3Codigos retirados do arquivo ServidorUDP.c

30 /∗ c r i a r socket UDP para receber ou env ia r datagramas ∗ /31 i f ( ( sock = socket ( PF INET , SOCK DGRAM, IPPROTO UDP) ) < 0 ){32 pe r ro r ( ” sock ( ) fa lhou ” ) ;33 }

35 /∗ c o n s t r u i r a e s t r u t u r a de endereco l o c a l ∗ /36 memset(& echoServAddr , 0 , sizeof ( echoServAddr ) ) ;37 echoServAddr . s i n f a m i l y = AF INET ;38 echoServAddr . s i n add r . s addr = h ton l ( INADDR ANY ) ;39 echoServAddr . s i n p o r t = htons ( numeroPorta ) ;

41 /∗ Bind ao endereco l o c a l ∗ /42 i f ( bind ( sock , ( struct sockaddr ∗ ) & echoServAddr ,43 sizeof ( echoServAddr )) <0){44 pe r ro r ( ” b ind ( ) fa lhou ” ) ;45 }

8 / 30

Page 9: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor UDP em C – 2/3Codigos retirados do arquivo ServidorUDP.c

47 while ( 1 ) {48 /∗ esperar mensagem de alguem ∗ /49 c l iAddrLen = sizeof ( echoClntAddr ) ;50 i f ( ( recvMsgSize = recvfrom ( sock , echoBuffer , ECHOMAX, 0 ,51 ( struct sockaddr ∗ ) & echoClntAddr , & c l iAddrLen )) <0){52 pe r ro r ( ” recvfrom ( ) fa lhou ” ) ;53 }54 p r i n t f ( ” Recebeu c l i e n t e %s\n ” ,55 i n e t n t o a ( echoClntAddr . s i n add r ) ) ;56 p r i n t f ( ”==> [%s] %d\n ” , echoBuffer , c l iAddrLen ) ;

68 /∗ env ia r a HORA para o c l i e n t e ∗ /69 i n t bytesEnviados = sendto ( sock , t i m e s t r i n g ,70 sizeof ( t i m e s t r i n g ) , 0 ,71 ( struct sockaddr ∗ )& echoClntAddr ,72 sizeof ( echoClntAddr ) ) ;73 p r i n t f ( ” enviando %d\n ” , bytesEnviados ) ;

9 / 30

Page 10: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor UDP em C – 3/3Codigos retirados do arquivo ClienteUDP.c

36 /∗ c r i a r um socket UDP ∗ /37 i f ( ( sock = socket ( PF INET , SOCK DGRAM, IPPROTO UDP) ) < 0 ){38 pe r ro r ( ” socket ( ) fa lhou ” ) ;39 }

41 /∗ c o n s t r u i r a e s t r u t u r a de endereco do se rv i do r ∗ /42 memset(& echoServAddr , 0 , sizeof ( echoServAddr ) ) ;43 echoServAddr . s i n f a m i l y = AF INET ;44 echoServAddr . s i n add r . s addr = i ne t add r ( nomeServidor ) ;45 echoServAddr . s i n p o r t = htons ( numeroPorta ) ;

47 /∗ env ia r o comando para o se rv i do r ∗ /48 sendto ( sock , mensagem , tamanhoMensagem+1 , 0 ,49 ( struct sockaddr ∗ ) & echoServAddr ,50 sizeof ( echoServAddr ) ) ;

52 /∗ receber uma resposta ∗ /53 fromSize = sizeof ( fromAddr ) ;54 respStr ingLen = recvfrom ( sock , echoBuffer , ECHOMAX, 0 ,55 ( struct sockaddr ∗ ) & fromAddr , & fromSize ) ;

10 / 30

Page 11: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

UDP usando a linguagem Java

Classes utilizadasDatagramSocket

new DatagramSocket (int porta)

DatagramPacketnew DatagramPacket (byte[] b, int length)new DatagramPacket (byte[] buf, int length,

InetAddress address, int port)

11 / 30

Page 12: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor UDP em Java – 1/3Codigos retirados do arquivo ServidorUDP.java

18 /∗ I n i c i a l i z a c a o do socket UDP ∗ /19 socket = new DatagramSocket (20 new In tege r ( numeroPorta ) . i n tVa l ue ( ) ) ;

22 /∗ Laco de recebimento de datagramas ∗ /23 while ( t r ue ){24 request = n u l l ;25 rep l y = n u l l ;26 buf = new byte [1024 ] ;2728 /∗ Preparacao do Datagrama de Recepcao ∗ /29 request = new DatagramPacket ( buf , buf . leng th ) ;

31 /∗ Recepcao bloqueante dos dados ∗ /32 socket . rece ive ( request ) ;3334 /∗ Recuperacao do comando ∗ /35 comando = new St r i ng ( request . getData ( ) , 0 ,36 request . getLength ( ) ) ;

12 / 30

Page 13: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor UDP em Java – 2/3Codigos retirados do arquivo ServidorUDP.java

43 /∗ Cr ia datagrama com a resposta ∗ /44 rep l y = new DatagramPacket ( hora . getBytes ( ) ,45 hora . getBytes ( ) . length ,46 request . getAddress ( ) ,47 request . ge tPor t ( ) ) ;

56 /∗ Envia resposta pelo socket UDP ∗ /57 socket . send ( rep l y ) ;

13 / 30

Page 14: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor UDP em Java – 3/3Codigos retirados do arquivo ClienteUDP.java

20 /∗ I n i c i a l i z a c a o de sockets UDP com Datagrama ∗ /21 socket = new DatagramSocket ( ) ;

23 /∗ Configuracao a p a r t i r dos parametros ∗ /24 InetAddress host = InetAddress . getByName ( nomeServidor ) ;25 serverPor t = new In tege r ( numeroPorta ) . i n tVa l ue ( ) ;26 byte [ ] m = mensagemEnviar . getBytes ( ) ;2728 /∗ Criacao do Pacote Datagrama para Envio ∗ /29 request = new DatagramPacket (m, m. length , host , serverPor t ) ;

31 /∗ Envio propr iamente d i t o ∗ /32 socket . send ( request ) ;

34 /∗ Preparacao do Pacote Datagrama para Recepcao ∗ /35 rep l y = new DatagramPacket ( buf , buf . leng th ) ;3637 /∗ Recepcao do re to rno ∗ /38 socket . rece ive ( rep l y ) ;

14 / 30

Page 15: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor em TCP

TCPOrientado a conexao (stream)Confiabilidade e IntegridadeMenos desempenho na comunicacao

15 / 30

Page 16: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

TCP usando a linguagem C

Principais funcoes

socket (int domain, int type, int protocol)

bind (int sockfd, struct sockaddr *addr, socklen t len)

listen (int sockfd, int backlog)

accept (int sockfd, struct sockaddr *addr, socklen t*addrlen);

send (int s, const void *buf, size t len, int flags);

recv (int s, void *buf, size t len, int flags);

connect (int sockfd, const struct sockaddr *serv addr,socklen t addrlen);

16 / 30

Page 17: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor TCP em C – 1/4Codigos retirados do arquivo ServidorTCP.c

36 /∗ Criacao do socket TCP para receber conexoes ∗ /37 i f ( ( servSock = socket ( PF INET , SOCK STREAM, IPPROTO TCP)) <0){38 pe r ro r ( ” socket ( ) fa lhou ” ) ;39 e x i t ( 1 ) ;40 }

43 /∗ construcao do endereco de conexao ∗ /44 memset(& echoServAddr , 0 , sizeof ( echoServAddr ) ) ;45 echoServAddr . s i n f a m i l y = AF INET ;46 echoServAddr . s i n add r . s addr = h ton l ( INADDR ANY ) ;47 echoServAddr . s i n p o r t = htons ( numeroPorta ) ;

49 /∗ Bind ao endereco l o c a l ∗ /50 i f ( bind ( servSock , ( struct sockaddr ∗ ) & echoServAddr ,51 sizeof ( echoServAddr ) ) < 0 ){52 pe r ro r ( ” b ind ( ) fa lhou ” ) ;53 e x i t ( 1 ) ;54 }

17 / 30

Page 18: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor TCP em C – 2/4Codigos retirados do arquivo ServidorTCP.c

57 /∗ l i s t e n ∗ /58 i f ( l i s ten ( servSock , MAXPENDING) < 0){59 pe r ro r ( ” l i s t e n ( ) fa lhou ” ) ;60 e x i t ( 1 ) ;61 }

64 while ( 1 ) {65 /∗ esperando conexoes com accept ∗ /66 c ln tLen = sizeof ( echoClntAddr ) ;67 i f ( ( c ln tSock = accept ( servSock ,68 ( struct sockaddr ∗ ) & echoClntAddr ,69 &c ln tLen ) ) < 0 ){70 pe r ro r ( ” accept ( ) fa lhou ” ) ;71 e x i t ( 1 ) ;72 }

18 / 30

Page 19: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor TCP em C – 3/4Codigos retirados do arquivo ServidorTCP.c

74 /∗ c ln tSock esta conectado a um c l i e n t e ∗ /75 p r i n t f ( ” Tratando c l i e n t e %s\n ” ,76 i n e t n t o a ( echoClntAddr . s i n add r ) ) ;77 while ( 1 ) {78 i f ( ( tamanhoRecebido = recv ( c lntSock , comando ,79 RCVBUFSIZE, 0 ) ) < 0 ){80 pe r ro r ( ” recv ( ) fa lhou \n ” ) ;81 e x i t ( 1 ) ;82 }

94 /∗ enviando dados ao c l i e n t e ∗ /95 i n t k = send ( c lntSock , t i m e s t r i n g , sizeof ( t i m e s t r i n g ) , 0 ) ;

19 / 30

Page 20: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor TCP em C – 4/4Codigos retirados do arquivo ClienteTCP.c

34 /∗ Criacao do Socket TCP ∗ /35 sock = socket ( PF INET , SOCK STREAM, IPPROTO TCP ) ;

37 /∗ construcao do endereco de conexao ∗ /38 memset(& echoServAddr , 0 , sizeof ( echoServAddr ) ) ;39 echoServAddr . s i n f a m i l y = AF INET ;40 echoServAddr . s i n add r . s addr = i ne t add r ( enderecoIPServidor ) ;41 echoServAddr . s i n p o r t = htons ( numeroPorta ) ;

43 /∗ Conectando ao se rv i do r ∗ /44 i f ( connect ( sock , ( struct sockaddr ∗ ) & echoServAddr ,45 sizeof ( echoServAddr ) ) < 0 ){46 pe r ro r ( ” connect ( ) fa lhou : ” ) ;47 e x i t ( 1 ) ;48 }

20 / 30

Page 21: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

TCP usando a linguagem Java

Principais Classes

ServerSocket (int port)

PrintWriter (OutputStream out, boolean autoFlush)

BufferedReader (Reader in)

21 / 30

Page 22: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor TCP em Java – 1/2Codigos retirados do arquivo ServidorTCP.java

20 /∗ I n i c i a l i z a c a o do server socket TCP ∗ /21 serverSocket = new ServerSocket (22 new In tege r ( numeroPorta ) . i n tVa l ue ( ) ) ;

24 while ( t r ue ){25 /∗ Espera por um c l i e n t e ∗ /26 c l i en tSocke t = serverSocket . accept ( ) ;

29 /∗ Preparacao dos f l uxos de entrada e saida ∗ /30 out = new P r i n t W r i t e r ( c l i en tSocke t . getOutputStream ( ) ,31 t rue ) ;32 i n = new BufferedReader (new InputStreamReader (33 c l i en tSocke t . getInputStream ( ) ) ) ;

35 /∗ Recuperacao dos comandos ∗ /36 while ( ( comando = i n . readLine ( ) ) ! = n u l l ) {

42 /∗ Escreve na saida a ’ hora ’ ∗ /43 out . p r i n t l n ( hora ) ;

22 / 30

Page 23: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Cliente-Servidor TCP em Java – 2/2Codigos retirados do arquivo ClienteTCP.java

17 /∗ I n i c i a l i z a c a o de socket TCP ∗ /18 socket = new Socket ( nomeServidor ,19 new In tege r ( numeroPorta ) . i n tVa l ue ( ) ) ;

21 /∗ I n i c i a l i z a c a o dos f l uxos de entrada e saida ∗ /22 i n = new BufferedReader (new InputStreamReader (23 socket . getInputStream ( ) ) ) ;24 out = new P r i n t W r i t e r ( socket . getOutputStream ( ) , t r ue ) ;

30 while ( ( mensagemEnviar = inReader . readLine ( ) ) ! = n u l l ){3132 /∗ Envio da mensagem ∗ /33 out . p r i n t l n ( mensagemEnviar ) ;3435 /∗ Recebimento da resposta do se rv i do r ∗ /36 St r i ng resposta = i n . readLine ( ) ;

45 out . c lose ( ) ;46 i n . c lose ( ) ;47 socket . c lose ( ) ;

23 / 30

Page 24: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast

Utilizado com suporte da camada Ethernet

Quando sem esse suporte, utiliza varios Unicast

Conceito de grupo

24 / 30

Page 25: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast usando a linguagem C

Principais funcoes

setsockopt (int s, int level, int optname,const void *optval, socklen t optlen);

25 / 30

Page 26: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast em C – 1/3Codigos retirados do arquivo MulticastReceiver.c

28 i f ( ( sock = socket ( PF INET , SOCK DGRAM, IPPROTO UDP) ) < 0 ){29 p r i n t f ( ” socket ( ) fa lhou \n ” ) ;30 }

32 /∗ c o n s t r u i r a e s t r u t u r a de endereco para o bind ∗ /33 memset(& mul t i cas tAddr , 0 , sizeof ( mu l t i cas tAddr ) ) ;34 mul t i cas tAddr . s i n f a m i l y = AF INET ;35 mul t i cas tAddr . s i n add r . s addr = h ton l ( INADDR ANY ) ;36 mul t i cas tAddr . s i n p o r t = htons ( m u l t i c a s t P o r t ) ;

38 /∗ bind ∗ /39 i f ( bind ( sock , ( struct sockaddr ∗ ) & mul t i cas tAddr ,40 sizeof ( mu l t i cas tAddr ) ) < 0 ){41 p r i n t f ( ” b ind ( ) fa lhou \n ” ) ;42 }

26 / 30

Page 27: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast em C – 2/3Codigos retirados do arquivo MulticastReceiver.c

44 /∗ ace r ta r opcoes do m u l t i c a s t ∗ /45 mul t i cas tRequest . i mr mu l t i add r . s addr =46 i ne t add r ( mu l t i cas t I P ) ;47 mul t i cas tRequest . i m r i n t e r f a c e . s addr = h ton l ( INADDR ANY ) ;48 i f ( setsockopt ( sock , IPPROTO IP , IP ADD MEMBERSHIP ,49 ( void ∗ ) & mul t icastRequest ,50 sizeof ( mu l t i cas tRequest ) ) < 0 ){51 p r i n t f ( ” setsockopt ( ) fa lhou \n ” ) ;52 }

54 /∗ Receive a s i ng l e datagram from the server ∗ /55 while ( 1 ) {56 i f ( ( recvStr ingLen = recvfrom ( sock , recvStr ing ,57 MAXRECVSTRING, 0 , NULL, 0 ) ) < 0 ){58 p r i n t f ( ” recvfrom ( ) fa lhou \n ” ) ;59 }

27 / 30

Page 28: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast em C – 3/3Codigos retirados do arquivo MulticastSender.c

30 i f ( ( sock = socket ( PF INET , SOCK DGRAM, IPPROTO UDP) ) < 0 ){31 p r i n t f ( ” socket ( ) fa lhou \n ” ) ;32 }

39 memset (& mul t i cas tAddr , 0 , sizeof ( mu l t i cas tAddr ) ) ;40 mul t i cas tAddr . s i n f a m i l y = AF INET ;41 mul t i cas tAddr . s i n add r . s addr = i ne t add r ( mu l t i cas t IP ) ;42 mul t i cas tAddr . s i n p o r t = htons ( m u l t i c a s t P o r t ) ;

50 i n t k = sendto ( sock , sendStr ing , sendStringLen , 0 ,51 ( struct sockaddr ∗ ) & mul t i cas tAddr ,52 sizeof ( mu l t i cas tAddr ) ) ;

28 / 30

Page 29: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast usando a linguagem Java

Principais classes

MulticastSocket (int port)

DatagramPacket (byte[] buf, int length)

29 / 30

Page 30: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast em Java – 1/3Codigos retirados do arquivo ServidorMulticast.java

11 MulticastSocket socket = new MulticastSocket ( por ta ) ;

12 InetAddress endereco = InetAddress . getByName ( args [ 1 ] ) ;13 socket . jo inGroup ( endereco ) ;

15 while ( t r ue ) {16 byte [ ] recvData = new byte [1024 ] ;17 DatagramPacket recvPacket ;18 recvPacket = new DatagramPacket ( recvData ,19 recvData . leng th ) ;20 socket . rece ive ( recvPacket ) ;

23 sentence = new St r i ng ( recvPacket . getData ( ) ) ;24 System . out . p r i n t25 ( recvPacket . getAddress ( ) . t o S t r i n g ( ) + ” : ” ) ;26 System . out . p r i n t l n ( sentence ) ;

30 / 30

Page 31: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Multicast em Java – 1/3Codigos retirados do arquivo ClienteMulticast.java

13 MulticastSocket c l i en tSocke t = new MulticastSocket ( ) ;

14 InetAddress endereco = InetAddress . getByName ( args [ 1 ] ) ;15 c l i en tSocke t . jo inGroup ( endereco ) ;

26 sendPacket = new DatagramPacket ( sendData ,27 sendData . length , endereco , por ta ) ;28 c l i en tSocke t . setTimeToLive ( t t l ) ;29 c l i en tSocke t . send ( sendPacket ) ;

34 c l i en tSocke t . leaveGroup ( endereco ) ;35 c l i en tSocke t . c lose ( ) ;

31 / 30

Page 32: INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast

Referencias

Man pages no Linux para funcoes C

Especificacao das classes Java na Internet

32 / 30