INF01018 – Aula Pr atica 1 –´ Cliente-Servidor e Multicast
Transcript of 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
Roteiro
1 Introducao
2 Cliente-Servidor
3 Multicast
4 Referencias
2 / 30
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
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
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
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
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
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
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
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
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
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
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
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
Cliente-Servidor em TCP
TCPOrientado a conexao (stream)Confiabilidade e IntegridadeMenos desempenho na comunicacao
15 / 30
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
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
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
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
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
TCP usando a linguagem Java
Principais Classes
ServerSocket (int port)
PrintWriter (OutputStream out, boolean autoFlush)
BufferedReader (Reader in)
21 / 30
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
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
Multicast
Utilizado com suporte da camada Ethernet
Quando sem esse suporte, utiliza varios Unicast
Conceito de grupo
24 / 30
Multicast usando a linguagem C
Principais funcoes
setsockopt (int s, int level, int optname,const void *optval, socklen t optlen);
25 / 30
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
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
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
Multicast usando a linguagem Java
Principais classes
MulticastSocket (int port)
DatagramPacket (byte[] buf, int length)
29 / 30
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
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
Referencias
Man pages no Linux para funcoes C
Especificacao das classes Java na Internet
32 / 30