Atividade 04

Chamada select() - programa de chat
MC823AB - 1s2004

Especificação

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.

Multiplexação de E/S

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.

Observações

  1. Quando o usuário local enviar fim de arquivo (^D), feche a conexão remota para indicar fim de conversação ao usuário remoto.

  2. Use a biblioteca 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.

  3. As rotinas de entrada da biblioteca curses, em última instância, lêem da entrada padrão. É possível, portanto, usar select e depois usar rotinas de entrada da curses.

  4. Faça o programa orientado a caractere, ou seja, cada caractere digitado numa ponta deve aparecer na outra (assim como talk).

  5. Opcional: você pode modificar o protocolo para trocar os nomes dos usuários no logo após o estabelecimento da conexão para exibi-los nos títulos das janelas ou nos prefixos de linhas.

Referências

Código-fonte


by Felipe M P