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. Isto pode ser feito de uma forma
extremamente simples utilizando dois processos no programa cliente
onde, digamos, o processo filho repetidamente lê uma linha da entrada
padrão e a envia pelo socket e o processo pai repetidamente lê uma linha do socket e a envia
para a saída padrão.
Um problema com esta abordagem é que o processo filho deve sinalizar o servidor
quando terminar de enviar o arquivo para o mesmo. Isto era feito antes simplesmente
fechando a conexão (via close()). Infelizmente não vai funcionar neste caso, pois
no momento do fechamento da conexão o processo pai ainda não recebeu todas as linhas
que estão sendo ecoadas pelo servidor.
Se a conexão for fechada pelo filho o pai perderá essas linhas e o sistema gerará
um erro do tipo broken pipe (teste!).
Por isto o processo filho deve executar um half close da conexão, isto é,
fechar a conexão apenas para escrita
invocando a função shutdown(descritor_socket, SHUT_WR).
O processo pai deve também esperar pelo término
do filho, antes de emitir as suas estatísticas e terminar.
Para isto ele pode usar a função do Unix wait(NULL);
Faça 2 testes 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
Inclua na tabela anterior as novas medidas de tempo. Eles devem ser
substancialmente menores do que os obtidos na solução do tipo "pedido-resposta" do item 1 acima.
Submeta o fonte do novo cliente e do servidor. Obs: não é necessário submeter o fonte
do cliente do item 1: apresente apenas uma tabela com os resultados das diversas medidas de tempo.
(*) Ao resolver esse problema, V. na verdade terá resolvido um problema mais
genérico e interessante que é: "como implementar um protocolo de aplicação usando TCP
onde mensagens são textuais, de tamanho variável e delimitadas por lf ?".