Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Trabalho 1
Danilo P. Lima,
Lucas S. Lima,
Renata A. A. Teles
13 de Abril de 2018
Conteúdo
1 Introdução 3
2 Exercı́cio 32 3
2.1 Código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Testes e Análise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Exercı́cio 33 8
3.1 Código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2 Testes e Análise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4 Conclusão 12
2
1 Introdução
Houve, nas últimas décadas, um grande crescimento das redes de computadores, e, prin-
cipalmente a popularização da Internet, que nada mais é do que a interligação de diversas
redes. Assim como nas redes locais, todo informação na Internet é gerada por aplicações
rodando em hosts servidores e clientes.
Para que seja possı́vel a troca de informações entre aplicações servidoras e clientes,
é necessário que exista, primeiramente, algum protocolo de comunicação a ser seguido
e, em seguida, uma estrutura no kernel dos sistemas operacionais que possibilite a uti-
lização dos recursos computacionais para a comunicação na Internet.
2 Exercı́cio 32
Eis o enunciado do exercı́cio 32 do capı́tulo um do livro Redes de Computadores [1]:
2.1 Código
• Servidor
1 # include < stdio .h >
2 # include < sys / types .h >
3 # include < sys / socket .h >
4 # include < netinet / in .h >
5 # include < netdb .h >
6 # include < stdlib .h >
7 # include < string .h >
8 # include < unistd .h >
9
3
11 # define MAX_PENDING 1
12 # define MAX_LINE 256
13
48 return 0;
49 }
• Cliente
1 # include < stdio .h >
2 # include < sys / types .h >
3 # include < sys / socket .h >
4 # include < netinet / in .h >
4
5 # include < netdb .h >
6 # include < stdlib .h >
7 # include < string .h >
8 # include < unistd .h >
9 # include < arpa / inet .h >
10
22 if ( argc == 2) {
23 host = ( char *) argv [1];
24 } else {
25 fprintf ( stderr , " usage : simplex - talk host \ n " ) ;
26 exit (1) ;
27 }
28
50 return 0;
5
51 }
Nos preâmbulos dos códigos, definem-se a porta TCP SERVER PORT e o tamanho
máximo para o buffer MAX LINE. No servidor, define-se, também, o tamanho máximo
da fila de espera. Em seguida, cria-se o soquete e o associa ao endereço do servidor e à
porta TCP.
A figura abaixo mostra a recepção das mensagens vindas do primeiro host a se conec-
tar.
6
Figura 2: Mensagens recebidas pela aplicação servidora.
A figura abaixo mostra o recebimento das mensagens de um novo host cliente após a
desconexão do primeiro host a se conectar.
7
A mudança no tamanho da fila de espera - valor de MAX PENDING - de 5 para 1
não surtiu efeito diferente devido ao fato de o experimento envolver apenas 2 clientes.
Dessa forma, havia exatamente 1 na fila. Se existisse um terceiro cliente, este já não
conseguiria estabelecer conexão se o tamanho máximo da fila for 1.
3 Exercı́cio 33
A seguir, tem-se o enunciado do exercı́cio 33:
3.1 Código
• Servidor
1 # include < stdio .h >
2 # include < sys / types .h >
3 # include < sys / socket .h >
4 # include < netinet / in .h >
5 # include < netdb .h >
6 # include < stdlib .h >
7 # include < string .h >
8 # include < unistd .h >
9
8
30 perror ( " simplex - talk : bind " ) ;
31 exit (1) ;
32 }
33 listen (s , MAX_PENDING ) ;
34 len = sizeof ( sin ) ;
35 while (1) {
36 if (( new_s = accept (s , ( struct sockaddr *) & sin , & len ) ) <
0) {
37 perror ( " simplex - talk : accept " ) ;
38 exit (1) ;
39 }
40 while ( len = recv ( new_s , buf , sizeof ( buf ) , 0) ) {
41 fputs ( buf , stdout ) ;
42 buf [ MAX_LINE -1] = ’ \0 ’;
43 send ( new_s , buf , len ,0) ; // Retransmite a mensagem
recebida em buf
44 }
45 close ( new_s ) ;
46 }
47 return 0;
48 }
• Cliente
1 # include < stdio .h >
2 # include < sys / types .h >
3 # include < sys / socket .h >
4 # include < netinet / in .h >
5 # include < netdb .h >
6 # include < stdlib .h >
7 # include < string .h >
8 # include < unistd .h >
9 # include < arpa / inet .h >
10
22 if ( argc == 2) {
23 host = ( char *) argv [1];
9
24 } else {
25 fprintf ( stderr , " usage : simplex - talk host \ n " ) ;
26 exit (1) ;
27 }
28
52 return 0;
53 }
10
3.2 Testes e Análise
Nesta nova situação, a principal diferença está na aplicação servidora retransmitir a
mensagem recebida ao host de origem. Seguimos o mesmo teste anterior, com diversos
hosts clientes conectados em uma fila de espera.
Novamente, diversos hosts clientes estavam em uma fila de espera para se conectar a
aplicação servidora.
Assim que o primeiro host se desconectou, o primeiro host da fila transmitiu suas
mensagens.
11
Figura 7: Mensagens do segundo host em espera.
4 Conclusão
Neste trabalho, foram desenvolvidos os códigos de uma aplicação servidora e de aplicações
clientes que resolvessem a duas questões propostas: a primeira onde a aplicação servidora
receberia mensagens de um host cliente conectado e a segunda onde além de receber a
mensagem, a aplicação servidora retransmitiria para o cliente uma cópia da informação.
Com este trabalho foi possı́vel entender, de maneira simplificada, como um servidor
comunica através de uma conexão TCP/IP, e observamos um método de gerenciamento
de múltiplas conexões que é o de criar uma lista de espera a medida que novos host
tentam se conectar, e assim que o host se desconecta ele trata o próximo da lista de
espera.
12
Todos os códigos executaram corretamente, evidenciando o funcionamento da fila de
espera para a conexão com o servidor.
Referências
[1] L.L. Peterson and B.S. Davie. Redes de Computadores - Uma abordagem de sistemas.
Campus, 2013.
13