Atividade 4 (obrigatória): serviço de eco usando E/S multiplexada

Atualizado em 24/09/08

O programa cliente da atividade 2.1 tem a característica "Pedido-Resposta": só envia a próxima linha ao servidor após receber do mesmo a linha anterior e enviá-la para a saída padrão ou para /dev/null. Seria interessante o cliente poder enviar o arquivo tendo como limitação apenas a velocidade de processamento no kernel da pilha TCP e a vazão pela rede ("throughput") da conexão TCP. O objetivo desta atividade é re-escrever o programa client_echo.c da atividade 2.1 usando a técnica de E/S multiplexada, de forma a enviar e receber o arquivo ecoado na maior velocidade possivel. Você obterá medidas de tempo muito próximas daquelas feitas com a atividade 2.2 ( implementação do serviço de eco com 2 processos) mas desta vez apenas um processo é requerido para implementar o cliente (nenhuma mudança precisa ser feita no servidor). Tome como modelo para o cliente o servidor de data e hora visto em aula e nas notas de aula.
Além disso V. deve instalar o servidor como um daemon (com alguns cuidados!(*)).

A explicação a seguir está detalhada nas notas de aula sobre buferização na biblioteca padrão da linguagem C: a política default de buferização das funções fgets e fputs da biblioteca padrão varia conforme o tipo de file pointer utilizado: no caso de file pointers associados a terminais, fgets retorna quando encontra o delimitador de linha (\n), ou seja a buferização é a nível de linha. Já no caso de file pointers associados a arquivos, pipes ou sockets, a buferização default é a nível de bloco, ou seja, fgets só retorna quando o buffer da biblioteca padrão estiver cheio (em geral >= 8KB). As mesmas considerações se aplicam a fputs, o que deixaria a nossa tentativa de solução acima bloqueada logo após primeiro comando fputs.
Existem duas soluções para o problema: alterar a buferização default através da função setvbuf (veja man setvbuf )ou forçar a saída e a entrada de cada linha através da função fflush. Neste laboratório V. deverá utilizar a solução com a função setvbuf.

  1. Verifique que a utilização da função setvbuf (ou fflush) é essencial para o programa funcionar.
  2. Antes de fazer os testes, instale o servidor server_echo.c como um daemon (veja notas de aula). Coloque o número do seu grupo como parte do nome do programa(*).
  3. Utilize um arquivo em disco como log do servidor. Use o número do seu grupo para identificar o arquivo de log. Veja também o aviso (*) no final deste documento!
  4. Faça 2 testes com medidas de tempo, redirecionando a saída padrão para /dev/null e tomando como entrada:
    (i) o arquivo /etc/termcap
    (ii)um arquivo ps grande, por exemplo, notas_aula.ps

Apresente numa tabela as medidas de tempo da atividade 2.2 (solução com 2 processos) e as medidas de tempo desta atividade, ambas quando o cliente e o servidor estão em redes distintas. Elas devem ser muito próximas.
Submeta os fontes do novo cliente e do servidor como daemon.


(*)Atenção: o seu daemon permanecerá executando na máquina mesmo após V. dar "logout". Por isso, descubra o seu pid usando o comando: ps -A e mate-o via comando kill -9 pid_daemon. Além disso, remova o seu arquivo de log do diretório /tmp.