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.
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.