MC833 - Programação em Redes de Computadores - 1s 2014

Exercício 3: Simplex-Talk

Professora Juliana Freitag Borin

Objetivo: Aprender a usar a abstração de socket na linguagem C e as chamadas de sistema associadas. Essas chamadas são muito úteis para construir aplicações de rede. Seus próximos laboratórios serão construídos com base nessas chamadas de sistema, por tanto, é importante que você se sinta confortável com seu uso.

Critérios para entrega e correção do exercício:

1. este exercício é individual;

2. O material a ser entregue deve ser enviado em um arquivo .tag.gz para castudillo (at) lrc (dot) ic (dot) unicamp (dot) br até às 9:59 do dia 20/03/2014. O nome do arquivo deve ser "exercicio3-raXXXXX", onde XXXXX deve ser substituído pelo número do seu RA;

3. o assunto da mensagem deve ser "MC833 - exercício 3";

4- a nota da atividade será 0 ou 1. 1, caso todas as questões estejam respondidas de forma satisfatória E a entrega atenda aos critérios 1, 2 e 3; 0, caso contrário.

Simplex-Talk

Os arquivos client.c e server.c contém, a implementação de um programa cliente/servidor simples que usa a interface de sockets para enviar mensagens por uma conexão TCP. O programa também usa outros utilitários de rede do UNIX, que serão apresentados à medida que eles aparecerem. Nossa aplicação permite que um usuário em uma máquina digite e envie texto a um usuário em outra máquina. Essa é uma versão simplificada do programa talk ("conversa") do UNIX, que aqui chamamos de Simplex-Talk. Essa aplicação é semelhante ao núcleo de uma aplicação de mensagem instantânea.

Cliente

Começamos com o lado cliente, que recebe o nome da máquina remota como argumento. Ele invoca o utilitário gethostbyname ("obter host a partir de nome") do UNIX para traduzir esse nome para o endereço IP do host remoto. O Próximo passo é construir a estrutura de dados relativa ao endereço (sin) esperada pela interface de sockets. Observe que essa estrutura de dados especifica que usaremos o socket para nos comunicarmos à Internet (AF_INET). Em nosso exemplo, usamos a porta TCP 10 como a porta bem conhecida do servidor; acontece que esta é uma porta que não foi atribuída a qualquer outro serviço da Internet. A última etapa no estabelecimento da conexão é estabelecida e o programa cliente entra no seu laco principal, que lê texto proveniente da entrada padrão e o envia pelo socket.

Servidor

O servidor também é muito simples. Primeiro ele constrói a estrutura de dados referente ao endereço preenchendo seu próprio número de porta (SERVER_PORT). Como ele não especifica um endereço IP, o aplicativo está disposto a aceitar conexões em qualquer um dos endereços IP do host local. Em seguida, o servidor realiza as etapas preliminares envolvidas em uma abertura passiva; ele cria o socket, o vincula ao endereço local e define o número máximo de conexões pendentes permitidas. Por fim, o laco principal espera até que um host remoro tente se conectar e, quando algum host fizer isso, o aplicativo recebe e imprime os caracteres que chegam pela conexão.

Atividades

Passos:
  1. Analise os códigos do programa Simplex-Talk e procure nas páginas de manual do Linux, a descrição das funções que não conhecer. Procure também nos códigos a natureza dos parâmetros que cada programa deve receber, se for o caso. Explique o funcionamento da função htons.
  2. Compile e execute os programas client.c e server.c em uma mesma máquina.
  3. Compile e execute os programas em máquinas diferentes (pode-se utilizar ssh.students.ic.unicamp.br para executar o binário gerado pela compilação do client.c e a sua estação para executar o binário gerado pela compilação do server.c)
  4. A função bind reportou algum erro? Em caso afirmativo, qual a sua causa? Se necessário, modifique os programas de forma que este erro seja corrigido e informe quais modificações foram realizadas.
  5. Execute os programas client.c e server.c em uma mesma máquina. Enquanto o primeiro cliente estiver sendo executando, inicie 10 outros clientes que se conectam ao mesmo servidor; esses outros clientes provavelmente deverão ser iniciados em segundo plano, com sua entrada redirecionada para um arquivo. O que acontece com esses 10 clientes? seus connect()s falham, esgotam o tempo limite ou têm sucesso? Alguma outra chamada é bloqueada- Agora encerre o primeiro cliente. O que acontece? Experimente isso também com o valor MAX_PENDING do servidor definido como 1.
  6. Através de ferramentas existentes no sistema operacional, como você comprova, durante a execução em máquinas diferentes ou na mesma máquina, que os códigos estão realizando uma comunicação via rede?
  7. O programa telnet pode ser usado no lugar do binário do client.c? Por que? Caso o telnet possa ser usado, copie a saída do servidor e da execução do telnet. Cite uma modificação no servidor.c que impediria a utilização do telnet
  8. Modifique o programa baseado em sockets denominado Simplex-Talk de modo que, toda vez que o cliente enviar uma linha ao servidor, este enviará a linha de volta ao cliente. O cliente (e o servidor) agora terá que fazer chamadas alternadas de recv() e send().
Material a ser entregue:
  1. um único arquivo .pdf contendo o relatório comprovando a execução de todos os passos acima (Devem ser incluídas as saídas das execuções dos programas, devem ser comentados os nomes/endereços das máquinas utilizadas e devem ser respondidas as questões).
  2. Os códigos servidor.c e cliente.c modificados conforme solicitado nos passos acima e devidamente comentados.
  3. um único arquivo .pdf contendo os códigos do servidor.c e cliente.c (Podem ser utilizados os programas a2ps e ps2pdf para gerar o arquivo -- Leia a manpage do a2ps!!! Por padrão a saída é enviada direto para a impressora!!!).