Elabore um sistema para conversação entre dois usuários -- chat --
baseado em TCP, similar ao programa talk
.
Para simplificar, vamos assumir que uma máquina corresponde a um usuário. Como número de porta, use um número baseado no RA de um dos integrantes (4 últimos dígitos + 30000), assim vários grupos poderão usar as mesmas máquinas.
Apenas um programa deverá ser feito. O host destino deverá ser passado como parâmetro. O protocolo simplificado é o seguinte:
1. tente se conectar ao destino; 2. se não conseguiu 3. aguarde conexão do segundo usuário; 4. fim se; 5. repita 6. espere por linha do teclado ou do socket; 7. se chegou linha do socket então 8. mostre na tela; 9. fim se; 10. se chegou linha do teclado então 11. envie para o lado remoto; 12. mostre na tela; 13. fim se; 14. até fim remoto (fechamento do socket) ou fim local (^D no teclado).
Assim, o primeiro usuário que tentar se conectar executará as chamadas
de servidor (listen()/accept()
) enquanto o segundo usuário executa
as chamadas de cliente (connect()
).
Tentativas de conexão quase simultâneas podem resultar num bloqueio (os dois usuários aguardando conexão). Esta possibilidade pode ser desconsiderada.
Neste experimento você precisa esperar entrada de dois descritores: da
entrada padrão (usuário no teclado) e do socket (usuário remoto). Use
E/S multiplexada, ou seja, a chamada select(2)
. Na verdade é essa
chamada que o experimento visa trabalhar.
curses
para facilitar a visualização. Você pode usar
duas janelas (uma para remoto e outra para local) ou reservar uma linha do
terminal e usar as restantes para exibir as linhas da conversa prefixadas
pelo nome do usuário/host. Há exemplos no código-fonte (v. abaixo).
Procuramos disponibilizar informações e código suficientes para que a
implementação da interface não ocupe maior tempo que a implementação do
protocolo.
talk
).
select()
select(2)
;
ncurses(3)
. Esta página oferece uma explicação
geral da biblioteca. Além dela, há uma página para cada grupo de rotinas;
talk(1)